日期:2014-05-20  浏览次数:20936 次

一个求和的算法,算法高手请进
求数值在   1   -   50   之内的任意5个数之和为100   。

数值:1,2,3,4,5,6....48,49,50
取其中的任意5个数,但这5个数相加之和要等于100,并将所有这种组合罗列
例:   1+10+19+20+50=100
          3+14+16+27+40=100

------解决方案--------------------
最笨的方法来了,呵呵

for(int i=1;i <=50;i++)
{
//求4个数之和等于100-i(排除i)
for(int j=1;j <=50;j++)
{
//求3个数之和等于100-i-j(排除ij)
for(int k=1;k <=50;k++)
{
//求2个数之和等于100-i-j-k(排除ijk)
for(int m=1;m <=50;m++)
{
//找某个数等于100-i-j-k-m(排除ijkm)
}
}
}
}
------解决方案--------------------
给你个 我想的 先从数学上来看
考虑 20 20 20 20 20
可以看出 第一个数 最大只能是18, 即18,19,20,21,22
那么考虑后面的数都相对第一个递增.
可以得到下面的算法.(无重复)

System.Text.StringBuilder sb = new System.Text.StringBuilder();
for(int ia=1; ia <=18; ia++)
{
for(int ib=ia+1; ib <=50; ib++)
{
for(int ic=ib+1; ic <=50; ic++)
{
for(int id=ic+1; id <=50; id++)
{
for(int ie=id+1; ie <=50; ie++)
{
if((ia+ib+ic+id+ie)== 100)
{
//Console.Write( "{0},{1},{2},{3},{4}\r\n ", ia,ib,ic,id,ie);
//Console.WriteLine( "---------- ");
sb.Append(ia + ", " + ib + ", " + ic+ ", " + id + ", " + ie + "\r\n ");
}
}
}
}
}
}
//Console.ReadLine();
System.IO.StreamWriter writer1 = new System.IO.StreamWriter( "d:\\test.txt ", true, Encoding.Default);
writer1.Write(sb.ToString());
writer1.Close();