从0~9的10个数字中取出所有的满足一定和值的4个数字,分可以重复和不可以重复两种情况。
比如和值为1的,
可重复的可以取000和1来自由排列组合成:1000,0100,0010,0001四个数组。
不重复的没有。和值为2的有取000和2,还有11和00的自由排列组合成:2000,0200……,1100,1010……等。这个的算法怎么写啊。大家给个建议。
比如和值为1的,
可重复的可以取000和1来自由排列组合成:1000,0100,0010,0001四个数组。
不重复的没有。和值为2的有取000和2,还有11和00的自由排列组合成:2000,0200……,1100,1010……等。这个的算法怎么写啊。大家给个建议。
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 */
}
我使用for循环0000~9999一万个数字,4位相加的值满足要求的取出来,估计这就是最笨也是最没效率的方法了。
谁给个高效率的回朔算法。
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;
}
}
}
}
}
}
}