给一个数N,算出有多少种组合可以使组合的数加起来的和等于这个数,组合中的数字可以重复,但是排序是有顺序的,就是说不同的排序顺序也算一种组合
例如:4有以下几种组合
1 1 1 1 
1 1 2 0 
1 2 1 0 
1 3 0 0 
2 1 1 0 
2 2 0 0 
3 1 0 0 
4 0 0 0求如何用程序得到N个数时的这个数组

解决方案 »

  1.   

    var
      i,j, k,g,s : integer;
    begin
      for i := 0 to 4 do
      begin
        for j := 0 to 4 do
        begin
          for k := 0 to 4 do
          begin
            for g := 0 to 4 do
            begin
              if (i+j+k+g) = 4 then
                Self.Memo1.Lines.Add(IntToStr(i)+IntToStr(j)+IntToStr(k)+IntToStr(g))
            end;
          end;
        end;
      end;
    end;
    0004
    0013
    0022
    0031
    0040
    0103
    0112
    0121
    0130
    0202
    0211
    0220
    0301
    0310
    0400
    1003
    1012
    1021
    1030
    1102
    1111
    1120
    1201
    1210
    1300
    2002
    2011
    2020
    2101
    2110
    2200
    3001
    3010
    3100
    4000
    这是运行结果 
      

  2.   

    num:=9
    len:=4
    //定义数组
    function get(n,l)
       for i:=0 to n do
       begin
         a(l) := i;
         if l==1 then 
            begin
               sum:=0
               for j:=1 to len do
               begin
                  sum:=sum+a(j)              
               end;
                  if sum==n then
                     //添加
             end
         else
            get(n,l-1)
       end;
    end functionget(num,l)
    好久不写对语法不熟了.
    就是用递归来实现,用一个全局的数组保存每层递归的一个录入数.
    1、在最深层判断当前len个数加起来,是否等于num等则输出,不等则不输出。判断完最深层退回一次。
    2、递进后再深入...
    3、重复1
    4、直到判断完