zoukankan      html  css  js  c++  java
  • 算法基础系列之一:非递归求和为数值N的所有组合

    CSDN上最近常常问到这样上面的问题,例如,求所有和为10的组合(组合中的数皆为自然数,且各不相同),则输出:

    1+2+3+4

    1+2+7

    1+3+6

    1+4+5

    1+9

    2+3+5

    2+8

    3+7

    4+6

    今天又有人问,回来想了想,递归的想起来头疼,写了一个非递归的方法,初步测试似乎没有错误,发上来请大家帮忙改进改进^^,也可帮忙提供一些更好的方法

            private static int Num = 10;

     

            static void Main(string[] args)

            {

                List<int> l = new List<int>();

                l.Add(0);

                int loopCount = 0;

                int outputCount = 0;

                int lastRemove = 0;

     

                while (true)

                {

                    if (Sum(l) < Num)

                    {

                        if (lastRemove == 0)

                        {

                            l.Add(l[l.Count - 1] + 1);

                        }

                        else

                        {

                            l.Add(lastRemove + 1);

                            lastRemove = 0;

                        }

                    }

     

                    if (Sum(l) == Num)

                    {

                        Console.WriteLine(Output(l));

                        outputCount++;

                        l.RemoveAt(l.Count - 1);

                        lastRemove = l[l.Count - 1];//

                        l.RemoveAt(l.Count - 1);

                    }

     

                    if (Sum(l) > Num)

                    {

                        l.RemoveAt(l.Count - 1);

                        l.RemoveAt(l.Count - 1);

                        if (Sum(l) > 0)

                        {

                            int x = Num - Sum(l);

                            Console.WriteLine(Output(l) + "+" + x.ToString());

                            outputCount++;

                        }

                        else

                        {

                            break;

                        }

                        lastRemove = l[l.Count - 1];

                        l.RemoveAt(l.Count - 1);

                    }

                    loopCount++;

                }

     

                Console.WriteLine("loop count:"+loopCount);

                Console.WriteLine("output count:" + outputCount);

                Console.Read();

            }

     

            static int Sum(List<int> l)

            {

                int sum = 0;

                for (int i = 0; i < l.Count; i++)

                {

                    sum += l[i];

                }

                return sum;

            }

     

            static string Output(List<int> l)

            {

                string output="";

                for (int i = 1; i < l.Count; i++)

                {

                    output += l[i].ToString() + "+";

                }

                return output.Substring(0, output.Length - 1);

            }

  • 相关阅读:
    IOS5,6,7不同版的适配. 强制旋转和自动旋转.
    第3条:多用字面量语法,少用与之等价的方法
    UIViewAnimation警告
    ViewController的生命周期分析和使用
    Chrome浏览器下调试SASS
    Reactjs相比较原生方案是绝对的快吗?哪些情况下React有优势
    js收集的一些好的题型
    js异步加载 defer和async 比较
    前端知识点
    H5下拉刷新特效demo,动画流畅
  • 原文地址:https://www.cnblogs.com/morvenhuang/p/494688.html
Copyright © 2011-2022 走看看