我有'n'个数量(非负整数)。我的要求是确定一组最佳金额,使组合的总和小于或等于给定的固定限额,总数尽可能大。可以包含在最佳集合中的金额数量没有限制。
例如:金额为143,2054,546,3564,1402,给定限额为5000.
根据我的理解,背包问题每个项目有两个属性(重量和值)。但是上面提到的问题只有一个属性(金额)。我希望这会让事情更简单吗? :)
有人可以帮我解决这个问题的算法或源代码吗?
答案 0 :(得分:1)
这仍然是一个NP难题,但如果你想(或必须)做类似的事情,也许这个主题可以帮助你:
find two or more numbers from a list of numbers that add up towards a given amount
我solved it like this和NikiC修改了它to be faster。唯一的区别:一个是关于获得确切数量,而不是“尽可能接近”,但这只是代码中的一些小变化(你必须将它翻译成你正在使用的语言)。
看看我的代码中的注释,以了解我正在尝试做什么,简而言之:
所以你必须改变:
答案 1 :(得分:0)
本书"Knapsack Problems"由Hans Kellerer,Ulrich Pferschy和David Pisinger称之为子集和问题,并将整个章节(第4章)用于其中。本章非常全面,涵盖了算法和计算结果。
即使这个问题是背包问题的一个特例,它仍然是NP难的。