从0~9的10个数字中取出所有的满足一定和值的4个数字,分可以重复和不可以重复两种情况。
比如和值为1的,
可重复的可以取000和1来自由排列组合成:1000,0100,0010,0001四个数组。
不重复的没有。和值为2的有取000和2,还有11和00的自由排列组合成:2000,0200……,1100,1010……等。这个的算法怎么写啊。大家给个建议。

解决方案 »

  1.   


    void Main()
    {
    var list=Enumerable.Range(0,10);
    var temp=2;
      var query=from a in list
    from b in list
    from c in list
    from d in list
    where a+b+c+d==temp
    select a+""+b+""+c+""+d;
    query.ToList().ForEach(q=>Console.WriteLine(q));
    Console.WriteLine("Distinct:");
    query.Distinct().ToList().ForEach(q=>Console.WriteLine(q));

    /*
    0002
    0011
    0020
    0101
    0110
    0200
    1001
    1010
    1100
    2000
    Distinct:
    0002
    0011
    0020
    0101
    0110
    0200
    1001
    1010
    1100
    2000 */
    }
      

  2.   

    觉得回朔算法应该可以,可惜基础太差不会写。
    我使用for循环0000~9999一万个数字,4位相加的值满足要求的取出来,估计这就是最笨也是最没效率的方法了。
    谁给个高效率的回朔算法。
      

  3.   

    太久不用有点生疏了using System;
    using System.Collections.Generic;using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;namespace Galsun.Nfdw.Web
    {
        public partial class index : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    int[] ary = new int[4];
                    int s = 3;
                    int n = 9;                while (s >= 0)
                    {                    if (ary[s] >= n || (ary[0] + ary[1] + ary[2] + ary[3]) > n)
                        {                        ary[s] = 0;                        s = s - 1;
                        }
                        else
                        {                        ary[s] = ary[s] + 1;
                            if ((ary[0] + ary[1] + ary[2] + ary[3]) == n)
                            {
                                Response.Write(string.Format("{0}{1}{2}{3}<br/>", ary[0], ary[1], ary[2], ary[3]));
                            }
                            if (ary[s] < n)
                            {
                                s = 3;
                            }
                        }
                    }
                }
            }
        }
    }