Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 背包问题的变种_Algorithm_Combinations - Fatal编程技术网

Algorithm 背包问题的变种

Algorithm 背包问题的变种,algorithm,combinations,Algorithm,Combinations,我有n个数量(非负整数)。我的要求是确定一组最佳金额,以便组合的总和小于或等于给定的固定限额,并且总数尽可能大。最佳集合中可以包含的金额数量没有限制 例如:金额为143205454635641402,给定限额为5000 根据我的理解,背包问题对于每个物品有两个属性(重量和价值)。但上述问题只有一个属性(数量)。我希望这会使事情变得更简单 有人能帮我解决这个问题的算法或源代码吗?这仍然是一个NP难问题,但如果你想(或不得不)做类似的事情,也许这个主题能帮你一点忙: 我在那里修改了它。唯一的区别是

我有n个数量(非负整数)。我的要求是确定一组最佳金额,以便组合的总和小于或等于给定的固定限额,并且总数尽可能大。最佳集合中可以包含的金额数量没有限制

例如:金额为143205454635641402,给定限额为5000

根据我的理解,背包问题对于每个物品有两个属性(重量和价值)。但上述问题只有一个属性(数量)。我希望这会使事情变得更简单


有人能帮我解决这个问题的算法或源代码吗?

这仍然是一个NP难问题,但如果你想(或不得不)做类似的事情,也许这个主题能帮你一点忙:

我在那里修改了它。唯一的区别是:这是关于得到确切的数量,而不是“尽可能接近”,但这只是代码中的一些小变化(你必须将其翻译成你正在使用的语言)

查看我的代码中的注释,了解我正在尝试做什么,简而言之:

  • 计算给定部分的所有可能组合,并将其相加
  • 如果结果是我要查找的数量,请将解决方案保存到数组中
  • 至少,对所有可能的解决方案进行排序,以获得使用最少部分的解决方案
因此,您必须更改:

  • 如果低于您要查找的数量,请保存解决方案
  • 按总量而不是使用的零件数量对解决方案进行排序
汉斯·凯勒尔、乌尔里奇·普弗希和大卫·皮辛格的书将此称为子集和问题,并用一整章(第4章)来讨论它。本章内容非常全面,涵盖了算法和计算结果


即使这个问题是背包问题的一个特例,它仍然是NP难的。

它是有界的。因此,如果n是合理的,这可以很快解决。(即n的最大值是多少?)答案是143+546+1402+2054=4145@Pete 3564 + 1402 = 4966@Ricky鲍比——没错,但那家伙必须把尽可能多的东西放进背包里(反正我读到了)。嗯。嗯,也许不是。如果问题是尽可能多地把重量放在背包里,那么你当然是对的。@Pete true,我错过了问题的那一部分:D