用于从集合中选择特定数量的元素以达到某个值的算法

时间:2011-05-10 13:11:57

标签: algorithm math random combinations

给定元素集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#程序。但语言并不重要,任何满足这些条件的算法都是可以接受的!

由于

2 个答案:

答案 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。

如果所有加数都达到了可能的最高值,则可以停止。你可能会在此之前很久就停止,由于我的英语水平,这可以留给读者。