背包问题的变种

时间:2011-09-08 09:59:08

标签: algorithm combinations

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

例如:金额为143,2054,546,3564,1402,给定限额为5000.

根据我的理解,背包问题每个项目有两个属性(重量和值)。但是上面提到的问题只有一个属性(金额)。我希望这会让事情更简单吗? :)

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

2 个答案:

答案 0 :(得分:1)

这仍然是一个NP难题,但如果你想(或必须)做类似的事情,也许这个主题可以帮助你:

find two or more numbers from a list of numbers that add up towards a given amount

solved it like thisNikiC修改了它to be faster。唯一的区别:一个是关于获得确切数量,而不是“尽可能接近”,但这只是代码中的一些小变化(你必须将它翻译成你正在使用的语言)。

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

  • 计算给定部分的所有可能组合并总结它们
  • 如果结果是我正在寻找的金额,请将解决方案保存到数组
  • 至少,对所有可能的解决方案进行排序以获得使用最少部分的解决方案

所以你必须改变:

  • 保存解决方案,如果它低于您要查找的金额
  • 按总金额而不是用过的零件数量对解决方案进行排序

答案 1 :(得分:0)

本书"Knapsack Problems"由Hans Kellerer,Ulrich Pferschy和David Pisinger称之为子集和问题,并将整个章节(第4章)用于其中。本章非常全面,涵盖了算法和计算结果。

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