把正整数N分解成M个正整数的和,即使M个数相同但顺序不同也认为是不同的方案,要求总方案数。如3=1+2跟3=2+1是两个不同的方案。
c++

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace ConsoleApplication1
    {    
        class Program
        {
            static void Main(string[] args)
            {
                var result = OutPut(16, new int[] { 1, 2, 4 }, new List<int>());
                foreach (var item in result)
                    Console.WriteLine(string.Join(",", item.Select(x => x.ToString())));
            }
     
            /// <summary>
            /// 求一个数 有些数的之和组成的排列
            /// </summary>
            /// <param name="sum">和数</param>
            /// <param name="array">构成的数字</param>
            /// <returns>返回能够组成的一个集合</returns>
            public static IEnumerable<List<int>> OutPut(int sum, int[] array, IEnumerable<int> seed)
            {
                if (seed.Sum() == sum)
                    yield return seed.ToList();
                else
                    foreach (var item in array.Select(x => seed.Concat(new int[] { x })).Where(x => x.Sum() <= sum).SelectMany(x => OutPut(sum, array, x)))
                        yield return item;
     
            }
        }
    }
      

  2.   

    http://bbs.csdn.net/topics/390360329和这个类似
    考虑顺序就去掉
    .Where(x => x >= seed.LastOrDefault())