首页 新闻 会员 周边

在一堆数中,加起来刚好等于某个指定的数,或接近指定的数。这个算法应该怎么写呢?

0
悬赏园豆:5 [待解决问题]

在一堆数中,加起来刚好等于某个指定的数,或接近指定的数。这个算法应该怎么写呢?

Wythe的主页 Wythe | 初学一级 | 园豆:56
提问于:2014-04-14 21:36
< >
分享
所有回答(3)
0

假设指定的数位TotalResult

一堆数字为DigitalNumberList as List(of integer)

1、只选取小于结果的数字,并按倒叙排列

dim query = from c in digitalnumberlist

        Order by c desc

                       where c<=TotalResult

2、逐个取出数字,进行加法运算。如果超出,则跳过,取下一个数字相加。循环直到总和等于TotalResult

或是所有数字完毕。

     这样就可以得到一组数字,可能不是最优的,如果要求最优的话,继续下一步骤。

3、基本的思路是先拿最大数,抛弃总和大于TotalResult的组合,剩下的排列组合里面取最优。中间可以加入判断,有相等的就跳出循环(除非要所有的解答)

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-04-14 21:47

第三步能否写点伪代码参照一下,谢谢

我的需求是: 如数组 List<int> ary=new List<int>(){2,3,8,9,11,12}; 如指定数字为:5 则找到数字为:2,3 如指定数字为:7 ,则找到数字:8

 

支持(0) 反对(0) Wythe | 园豆:56 (初学一级) | 2014-04-14 22:04
0

先排序是必须的,然后从大数开始遍历,比如 54321 指定的数是8

遍历的从5开始,5小于8 所以算他一个 然后到4,4+5大于8,4就排除了.这样继续下去到数组结束,或者等于指定数.

结果应该是最优结果了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-04-15 09:11
  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();
            }
        }

这个写法是能找到相等的值,就是效率很低

支持(0) 反对(0) Wythe | 园豆:56 (初学一级) | 2014-04-15 09:18

@Wythe: 看过了,不懂啊,算法一点不在行啊

支持(0) 反对(0) Wythe | 园豆:56 (初学一级) | 2014-04-15 11:22
0

变形的背包/装箱问题:

百科中有算法

hailants | 园豆:750 (小虾三级) | 2014-04-15 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册