在工作中遇见的难题,可以简化为如下的数学模型:已知数组A和B,长度为n,数据类型为double。从A的n个元素中任取m个数(1<=m<=n),按照相同的下标从B中相应取出m个数,P=(A[i1]+A[i2]...+A[im])/(B[i1]+B[i2]+...+B[im])。如何遍历所有的m计算出所有的P,从而得到P的最大值和最小值。当从A、B中取m个数时,要遍历取m个数所有的组合(而不是排列),即i1、i2、...、im不一定为从小到大连续的整数,仅表示从A中和从B中取数时,元素的下表要对应。

解决方案 »

  1.   

    不是高手,
    第二次来Delphi区
    受过别人的支持,
    现在来支持别人一下var
    top:integer = 0;
    stack:array[0..MAX_SIZE] of integer;function comb( index:integer; a:array of integer ):integer;
    begin
       if( top == m )
           begin
           DispStack;
           result:=1;
           end
       else
           begin
           for( i:=index; i < n; i++ )
                begin
                stack[top]:= a[i];
                inc(top);
                result:= result+comb( i+1, a );
                dec(top);
                end;
           end;
    end;
      

  2.   

    研究要多全啊……^_^……var
    top:integer = 0;
    stack:array[0..MAX_SIZE] of integer;procedure DispStack;
    var
       i:integer;
    begin
       for i:=0 to top  do
           begin
           write(stack[i],',');
           end;
       writeln;
    end;function comb( index:integer; a:array of integer ):integer;
    begin
       if( top == m )
           begin
           DispStack;
           result:=1;
           end
       else
           begin
           for( i:=index; i < n; i++ )
                begin
                stack[top]:= a[i];
                inc(top);
                result:= result+comb( i+1, a );
                dec(top);
                end;
           end;
    end;