当前位置:编程学习 > C#/ASP.NET >>

最近一个项目需要一个算法。请大家来帮忙。


有N个数,用户输入一个数。
比如有100个数,用户输入他要的数量Sum,系统将自动从100个数中调选一些数加起来=Sum的。(要求sum由100个数中最少个数组成的)例1:1,1,3,5,7,用户输入10. 系统选到3+7。例2: 1,1,3,5,7,2,8 用户输入10.3+7,2+8都要显视出来让用户选
如果不符合=sum的。返回
--------------------编程问答-------------------- 有N个数,用户输入一个数。
比如有100个数,用户输入他要的数量Sum,系统将自动从100个数中调选一些数加起来=Sum的。(要求sum由100个数中最少个数组成的)例1:1,1,3,5,7,用户输入10. 系统选到3+7。例2: 1,1,3,5,7,2,8 用户输入10.3+7,2+8都要显视出来让用户选
如果不符合=sum的。返回
--------------------编程问答-------------------- welcome!up! --------------------编程问答-------------------- 帮顶,算法费脑筋 --------------------编程问答-------------------- )例1:1,1,3,5,7,用户输入10. 系统选到3+7。例2: 1,1,3,5,7,2,8 
这些1,3,5,7 怎么来的?用户自己输还是怎么的 --------------------编程问答-------------------- 有空的高手来试试啊。 --------------------编程问答--------------------
引用 4 楼 wuxinyuyun 的回复:
)例1:1,1,3,5,7,用户输入10. 系统选到3+7。例2: 1,1,3,5,7,2,8 
这些1,3,5,7 怎么来的?用户自己输还是怎么的

已经有的了。在数据库里面。 --------------------编程问答-------------------- 有点意思,留名。 --------------------编程问答-------------------- 这是组合问题,
1、将大于sum的元素全部排出掉,若有,
2、在赛选后的结果集中任取2个数组合,每组求和比较,若=sum则将组合数输出,反正继续求3的组合,求4的组合,若n-1个组合都无满足结果,则无满足的结果存在, --------------------编程问答-------------------- case up  ------------------------- --------------------编程问答-------------------- 路过,学习了~ --------------------编程问答-------------------- !!!!!!!!!!!!!!!!!!!!! --------------------编程问答-------------------- 首先确定你那n个数的集合大小,如果只是100个数,那根本不用什么算法,只要循环就可以了,只要不在循环内连数据库读取数据,速度上根本不成问题。只有那个集合很大,循环判断sum会很慢时再考虑用算法来提高效率 --------------------编程问答-------------------- 以前我写过一个,下班回家把代码贴上,但是代码的效率我就没考虑了。 --------------------编程问答-------------------- 12楼正解 --------------------编程问答-------------------- 用循环就可以了 
然后判断一下 --------------------编程问答-------------------- 是两个数还是n个数加起来等于输入的sum? --------------------编程问答-------------------- 顶下! --------------------编程问答-------------------- 背包算法...自己去查查吧... --------------------编程问答--------------------
引用 12 楼 ledmhcc 的回复:
首先确定你那n个数的集合大小,如果只是100个数,那根本不用什么算法,只要循环就可以了,只要不在循环内连数据库读取数据,速度上根本不成问题。只有那个集合很大,循环判断sum会很慢时再考虑用算法来提高效率


同意 --------------------编程问答-------------------- 目前不考虑效率的话
1.用穷举,可得到所有的满足相当= sum的组合
2.从这些组合中, 筛选出无数最少的那一组, 如果最小元数的组合存在多个,则让用户自己选择. --------------------编程问答-------------------- 上面打错个字 相当== 相加, 我大概写了一段码(仅尝试两两相加),没有调试

  int[] a = new {1,2,3,4,5,6,7,8,9};
  int sum = 10;
  string[] str = new string[9];  // 保存尝试结果
  for(int i = 0; i < 9; i++)
  {
    str[i] = a[i].ToString() + "+";
    for(int j = i + 1; j < 9; j++)
    {
      if(a[i] + a[j] == sum)
      {
         str += a[j].ToString();
         Continue;
      } 
    }
  }

--------------------编程问答-------------------- using DP --------------------编程问答-------------------- 如果两两相加没找到满足条件的组合 ,则查询三个数相加,依次类推, 很久没玩算法了, 应该还有更简单的方法 ,只是没想到. --------------------编程问答-------------------- 这个问题,我遇见了,没解决,陈老师帮我解决了,他技术很不错的,在IT人际网小有名气,我有问题就问他了,楼主还头疼吗?不妨去问问他吧 --------------------编程问答--------------------         private void button2_Click(object sender, EventArgs e)
        {
            int count = 100;
            int[] data = new int[count];
            Random rd = new Random();
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = rd.Next(0, 100);
            }

            Array.Sort(data);

            Sum(data, 100, 0, 0, "");

            foreach (string str in list)
            {
                Console.Write(str);
            }
        }

        List<string> list = new List<string>();

        /// <summary>
        /// 求和
        /// </summary>
        /// <param name="data">用于计算的int数据</param>
        /// <param name="sum">需要求和的结果</param>
        /// <param name="current">上一步求和结果</param>
        /// <param name="index">当前要计算的数据下标</param>
        /// <param name="l">保存临时计算出来的数据,用字符串保存</param>
        private void Sum(int[] data, int sum, int current, int index, string l)
        {
            // 越界
            if (index >= data.Length)
            {
                return;
            }

            // 求和结果相等,保存结果
            if (current + data[index] == sum)
            {
                list.Add(l + "," + data[index].ToString());
                return;
            }
            // 超过了,返回
            else if (current + data[index] > sum)
            {
                return;
            }
            // 求和当前值,计算下一个值
            else
            {
                Sum(data, sum, current + data[index], index + 1, l + "," + data[index].ToString());
            }

            // 不计算当前值,计算下一个值
            Sum(data, sum, current, index + 1, l);
      --------------------编程问答-------------------- 楼上算法是有问题的,有重复,而且比较慢。

我记得我以前好像写过,等哈整理一下发给你。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,