• 算法基础系列之一:非递归求和为数值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);

            }

  • 相关阅读:
    30天敏捷结果(26): 如何解决问题
    30天敏捷结果(30):提升敏捷结果
    30天敏捷结果(27):做些有重要意义的事
    STM32笔记A
    嵌入式linux驱动开发入门总结
    2014年个人计划
    迄今为止见过最好的职业规划
    30天敏捷结果(28):撰写你的个人使命
    C语言深度解剖读书笔记
    基于 SQLite 数据库的 C# 实体模型的实现
  • 原文地址:https://www.cnblogs.com/morvenhuang/p/494688.html
Copyright © 2020-2023  润新知