我的思路是:
100=500?
100+200=500?
..
100+200+300+400+500=500?200=500?
200+300=500?
..
200+300+400+500=500?300=500?
300+400=500?
..
300+400+500=500?
.
.
500=500?
用2次循环
a=500;
sum=0;p
b={100,200,300,400,500}
for(i=1;i<b.len;i++)
{
  if (b[i]==1)
    {  ----ok-----   } 
  for(j=i;j<b.len;j++)
    {
     sum=sum+b[j]
     if (sumn==a)
       {-------ok--------}
    }
  sum=0
}对不起,c#语法忘的差不多了

解决方案 »

  1.   

    jiutiao(爱吃西瓜的麻雀):你的提议不错哦!
    我上面的没有考虑3的相加,4个的相加,5.6.......
    不过你里面执行会是这样
    100+200=500?
    100+200+300=500?
    100+200+300+400=500?
    100+200+300+400+500=?
    是吗?那就不好了,你少了检查100+300=500?
    我觉得应该把你的方法和我的方法集合起来!
      

  2.   

    此算法调试通过。现考虑从{100,200,300,400,500}这5个数中选一些数加起来等于800的情况。分析:
    对于这5个数中的每一个数而言,只存在着两种情况,即选中与不选中。
    定义选中状态为'1',不选中状态记为'0'。这样的排列组合共有2的5次方-1种情况
    即   0 0 0 0 1 (代表只选中500)
         0 0 0 1 0 (代表只选中400)
         0 0 0 1 1 (代表只选中400,500)
           .....
         1 1 1 1 1 (代表5个数全选中)如存在某种组合 a,b,c,d,e (a,b,c,d,e只可能是0或1),
    使得a*100+b*200+c*300+d*400+e*500=800,则这种组合合符条件。
    而   把 00001当二进制数看,其值为1
         把 00010当二进制数看,其值为2
           .....
         把 11111当二进制数看,其值为31所以可以这样处理
        for(int i=1;i<31;i++)
          {
              1.把i翻译成2进制数格式的字符串  (下面的代码中通过过程TenToTwo实现)
              2.计算a*100+b*200+c*300+d*400+e*500的值
                (其中a,b,c,d,e是上述翻译成2进制数格式的字符串的第0到第4位的值)
              3.判断
          }
         
    代码如下:
             int source=800;
    int[] basenum=new int[5]{100,200,300,400,500}; int n=5;//5个数字
    int times=1;
       
    for(int i=1;i<=n;i++)
        times*=2;//不知有没有求x的y次方函数 string tempstr="";
    for(int i=1;i<=times-1;i++)
    {
    tempstr=TenToTwo(i,n) ;
    int sum=0;
    for(int j=1;j<=n;j++)
    {
         if(tempstr.Substring(j-1,1)=="1")
    sum=sum+basenum[j-1];
    }
    if(sum==source)
    MessageBox.Show(tempstr);
    }
        
    十进制到二进制函数
       private string TenToTwo(int x,int length)
    {
    int modnum;
    string returnstring="";
    while (x>0)
    {
    modnum=x % 2;
    x=(int)(x/2);
    returnstring=modnum.ToString()+returnstring;
    }
    length=length-returnstring.Length;
    for(int i=1;i<=length;i++)
    {
    returnstring="0"+returnstring;
    }
    return returnstring;
    }上述代码运行结果:
              弹出3种组合:  00101,10110,11001
              
          00101表示选中300+500=800  ......