在一堆数中,加起来刚好等于某个指定的数,或接近指定的数。这个算法应该怎么写呢?
假设指定的数位TotalResult
一堆数字为DigitalNumberList as List(of integer)
1、只选取小于结果的数字,并按倒叙排列
dim query = from c in digitalnumberlist
Order by c desc
where c<=TotalResult
2、逐个取出数字,进行加法运算。如果超出,则跳过,取下一个数字相加。循环直到总和等于TotalResult
或是所有数字完毕。
这样就可以得到一组数字,可能不是最优的,如果要求最优的话,继续下一步骤。
3、基本的思路是先拿最大数,抛弃总和大于TotalResult的组合,剩下的排列组合里面取最优。中间可以加入判断,有相等的就跳出循环(除非要所有的解答)
第三步能否写点伪代码参照一下,谢谢
我的需求是: 如数组 List<int> ary=new List<int>(){2,3,8,9,11,12}; 如指定数字为:5 则找到数字为:2,3 如指定数字为:7 ,则找到数字:8
先排序是必须的,然后从大数开始遍历,比如 54321 指定的数是8
遍历的从5开始,5小于8 所以算他一个 然后到4,4+5大于8,4就排除了.这样继续下去到数组结束,或者等于指定数.
结果应该是最优结果了
private void CalSum(List<YpInfo> array, double result) { for (int i = 1; i < 1 << array.Count; i++) { sum = 0; slzh.Clear(); for (int j = 0; j < array.Count; j++) { if ((i & 1 << j) != 0) { YpInfo _ypinfo = array[j]; sum += _ypinfo.ypsl; slzh.Add(_ypinfo.xh); } } if (sum == result) { break; } } if (result == 0) { sum = 0; slzh.Clear(); } }
这个写法是能找到相等的值,就是效率很低
@Wythe: 看过了,不懂啊,算法一点不在行啊