有一组不规则的数:1132、544、844、929、348、1136、1066,1197。现用规定的数6000来减它们,无论只减以这一组数中某一个数的本身还是减以这个数与其它数的组合,只要能得到的差是最少的(这个差最好小于100),就符合要求。
比如:
6000 - (1197*5) = 15
6000 - (1132*4+544*1+844*1) = 84 
6000 - (929*6+348*1)= 78
6000 - (1136*4+544*1+844*1) = 68
6000 - (1066*4+844*2) = 48
6000 - (544*11) = 16
(注:1132*4表时有4个1132相加,即:1132+1132+1132+1332;544*1表时只有一个544)
不知我这样说够不够清楚。

解决方案 »

  1.   

    int[] intArr = new int[] {1132,544,844,929,348,1136,1066,1197,...};//全局变量
    int boss = 6000;
    ArrayList list = new ArrayList();//全局变量
    foreach(int i in intArr)
    {
        int j = 6000 - i;
        if(j > 100)
        {
             this.goon(j);//goon 是一个函数 在下面有定义
        }
        else
        {
            if(j>0)
            {list.Add(j);}
        }
    }
    private void goon(int j)
    {
       foreach(int i in intArr)
       {
           j = j - i;
           if(j>100)
           {
               this.goon(j);
           }
           else
           {
               if(j>0)
               {list.Add(j);}
           }
       }
    }
      

  2.   

    TO:Dennis_maomao(大熊猫) 
    再问个超低级的问题,如果要照看“list”里的面的数据,要怎么做。
      

  3.   

    for(int i=0;i<list.Count;i++)
      Console.WriteLine(list[i].ToString());
      

  4.   

    晕,我刚才也是这样试啊,但输出来的是“SYSTEM.ARRAYLIST”
      

  5.   

    TO:Dennis_maomao(大熊猫) 
    能再麻烦你一下吗?输出来的是结果是它最后计算出来的结果,我想要他输出来是整条公式,请问有怎么写呢?
    比如这样:
    6000 - (1197*5) = 15
    6000 - (1132*4+544*1+844*1) = 84 
    6000 - (929*6+348*1)= 78
    6000 - (1136*4+544*1+844*1) = 68
    6000 - (1066*4+844*2) = 48
    6000 - (544*11) = 16
      

  6.   

    呜呜·~~感动,第一次有高手为我谢BLOG,谢谢insiderc()
    超级的感谢。
      

  7.   

    TO:insiderc() http://blog.csdn.net/insiderc/archive/2006/09/03/1163600.aspx首先谢谢你的程序
    不过我发现了还有两个问题没解决,第一,只能用一种源长度来算数组中所有长度的最优组合,就像我在CSDN问到的问题那样,用6000来算出所有的长度“1132,544,844,929,348,1136,1066,1197”的组合,而不应是只有一种。比如,上面的程序只算能出6000-(1197*5)=15是最优的,而这些:6000 - (1132*4+544*1+844*1) = 84  6000 - (929*6+348*1)= 78 6000 - (1136*4+544*1+844*1) = 68
    6000 - (1066*4+844*2) = 48 6000 - (544*11) = 16 没有算出来,还有最优的限至应该是把余数限至在小于100的情况下。
    还有一个更难的问题,如果把“1132,544,844,929,348,1136,1066,1197”看成一种型材(木材)长度,而每种长度都需要一定的数量,比如:1132*15、544*8、844*11、929*7、348*9、1136*3、1066*17、1197*9(注:“1132*15”的意思是1132的这种长度需要的数量是15根)。上面的算法是实现一种最优化的算法,那么在加上了这个数量限至后,当上面的算法在进行最优运算时,发现某种长度的数量在达到要求后就不再拿这种长度进行运算了,继而转向对其它数量还没有达的要求的长度进行计算。