有一个问请你帮忙解决,问题是:
可分解项有
(1)A+B+C+D          28元
(2)A+B+C或A+B+D       23元 
(3)B+C+D或A+C+D       19元
(4)A+C,A+D,B+C,C+D,A+B   15元如2A+2B+C+D分解成
一种方法:A+B+C+D、A+B=28元+15元=43元
二种方法:A+B+C、A+B+D=23元+23元=46元当然我先第一种方法更便宜43元最小
请问有谁能帮我设计这个算法,我给他几百分,另还有给分。

解决方案 »

  1.   

    2A+2B+C+D分解算法问题  
    -----------------------
    请问:你是针对这个算式还是任意算式?
      

  2.   

    是任意算式,2A+2B+C+D只是一个实例。要知道哪一种分解方法更便宜。最后要知道下面中组成的
    (1)A+B+C+D          28元
    (2)A+B+C或A+B+D       23元 
    (3)B+C+D或A+C+D       19元
    (4)A+B,A+C,A+D,B+C,B+D,C+D, 15元。
    兄弟,我急、急、急呀!!!!!!!!!!!!!!!!!!
      

  3.   

    怎么没人回答,我给写一个吧 ^^ TurboPascal 7.0 win2000program ABCD;const
    Mask : array [1..10] of Integer =($f,
    $e, $d,
    $7, $b,
    $a, $9, $6, $3, $c);function GetVal(s: Integer): Integer;
    begin
    case s of
      $f:
       GetVal := 28;
      $e, $d:
       GetVal := 23;
      $7, $b:
       GetVal := 19;
      $a, $9, $6, $3, $c:
       GetVal := 15;
      end;
    end;var
    i, k, j, p, m: Integer;
      Sel: array [1..10] of Boolean;
      Total: array [1..4] of Integer;
    begin
      for i := 1 to $3ff do
      begin
        k := $200;
        for j := 1 to 10 do
        begin
          if i and k <> 0 then
           Sel[j] := True
          else
           Sel[j] := False;
          k := k shr 1;
        end;    FillChar(Total, 4 * SizeOf(Integer), 0);
        for j := 1 to 10 do
         if Sel[j] then
          begin
            k := $8;
            for p := 1 to 4 do
            begin
              if Mask[j] and k <> 0 then
                Inc(Total[p]);
              k := k shr 1;
            end;
          end;    if (Total[1] = 2) and (Total[2] = 2) and (Total[3] = 1) and (Total[4] = 1) then
        begin
         m := 0;
          for j := 1 to 10 do
          begin
           if Sel[j] then
            begin
              k := $8;
              for p := 1 to 4 do
              begin
                if Mask[j] and k <> 0 then
                 Write(Chr(p + Ord('A') -1));
                k := k shr 1;
              end;
             Inc(m, GetVal(Mask[j]));
            end;
            Write(' ');
          end;
          Writeln(m);
        end;
      end;
    end.程序中大量使用了位运算的办法。
    数组Mask为原始的串,后四位分别表示ABCD,有1则表示选定。
    运行结果为所有可能的情况:      AD BC  AB 45
     ABC ABD        46
    ABCD         AB 43
    要求其它表达式的排列方案,只需修改
    if (Total[1] = 2) and (Total[2] = 2) and (Total[3] = 1) and (Total[4] = 1) then
    行中的条件即可。
      

  4.   

    樓主,能不能分解成只有單個的?
    2A+2B+C+D
    分解成
    A+B+C+D,A,B
    允許這樣分解麼?
      

  5.   

    (1)A+B+C+D          28元
    (2)A+B+C或A+B+D       23元 
    (3)B+C+D或A+C+D       19元
    (4)A+C,A+D,B+C,C+D,A+B   15元这几个式子不矛盾么?通过前两个可以得出C=D=5,则对(4)A=B=10,而对(3)A=B=9
      

  6.   

    (1)A+B+C+D          28元
    (2)A+B+C或A+B+D       23元 
    (3)B+C+D或A+C+D       19元
    (4)A+C,A+D,B+C,C+D,A+B   15元这几个式子不矛盾么?通过前两个可以得出C=D=5,则对(4)A=B=10,而对(3)A=B=9

    ----------------------------------------------------------------------------
    没有矛盾啊,不同的组合价格不同而已能不能把不同组合看成一个整体,然后转化成背包问题???呵呵
    不知道可不可行