给定元素集n [1],n [2],n [3],...... n [x]和数字V.(元素有自己的值)
我想找到满足以下条件的所有元素组合:
1)每个组合包含特定数量的元素(例如:恰好5个元素)
组合#1: n [1],n [2],n [21],n [22],n [24]
组合#2: n [1],n [2],n [12],n [15],n [33]
......
2)组合中元素值的总和必须小于给定的数字V(例如V = 100)
组合#1: n [1] + n [2] + n [21] + n [22] + n [24]< 100
组合#2: n [1] + n [2] + n [12] + n [15] + n [33]< 100
......
我正在尝试编写一个计算这些元素的c#程序。但语言并不重要,任何满足这些条件的算法都是可以接受的!
由于
答案 0 :(得分:0)
我不太确定,但也许你可以调整这个想法,条件是所有组合必须有一定数量的元素。
http://en.wikipedia.org/wiki/Knapsack_problem
然而,据说背包问题具有NP-complete的复杂性才能完全解决......这是个坏消息。所以人们建议做的是使用回溯算法。
我相信你会在google中找到很多关于背包问题的回溯代码。
我希望这会有所帮助
答案 1 :(得分:0)
由于您可能不得不使用暴力,您可以使用以下方法解决问题:
首先,对输入集S进行排序。
然后从S中删除大于V - 4*|min|
的所有元素(其中|min|
是最小元素的绝对值),因为它们不会出现在任何解决方案中。根据您的确切问题规范,可以进一步改进此优化。
现在,您将生成S中元素长度C的所有总和,从最小的可能数字开始(请记住S已排序)。
如果结果小于V,请将其添加到解决方案集中并增加最后一个加数。
否则,将之前增加的summand和所有之后的值设置为最小可能值,并在此之前增加summand。
如果所有加数都达到了可能的最高值,则可以停止。你可能会在此之前很久就停止,由于我的英语水平,这可以留给读者。