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);

            }

  • 相关阅读:
    彻底搞清分库分表(垂直分库,垂直分表,水平分库,水平分表)
    linux服务器上tcp有大量time_wait状态的解决方法和原因解释
    mysql,既可以自己的字段相乘,也可以乘固定的字段
    vscode 滚动设置字体大小
    nodejs 定时任务 node-schedule 库
    Node.js中的环境变量
    js 打印错误堆栈
    springboot 返回的json中忽略null属性值,不传递
    idea跳转到指定行列快捷键
    Spring boot + MyBatis返回map中null值处理
  • 原文地址:https://www.cnblogs.com/morvenhuang/p/494688.html
Copyright © 2011-2022 走看看