2A+2B+C+D分解算法问题

Jute 2005-01-20 10:49:12
有一个问请你帮忙解决,问题是:
可分解项有
(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元最小
请问有谁能帮我设计这个算法,我给他几百分,另还有给分。
...全文
170 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Blakhawk 2005-01-21
  • 打赏
  • 举报
回复
up
Jute 2005-01-21
  • 打赏
  • 举报
回复
目前是4类。以后可以扩充到E。好的我试一试下,
QuickKeyBoard 2005-01-21
  • 打赏
  • 举报
回复
我说,你两次给的原始串可不一样呵,自己修改一下程序吧。
QuickKeyBoard 2005-01-21
  • 打赏
  • 举报
回复
怎么没人回答,我给写一个吧 ^^ TurboPascal 7.0 win2000

program 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
行中的条件即可。
Jute 2005-01-21
  • 打赏
  • 举报
回复
是任意算式,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元。
兄弟,我急、急、急呀!!!!!!!!!!!!!!!!!!
何鲁青 2005-01-21
  • 打赏
  • 举报
回复
(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

----------------------------------------------------------------------------
没有矛盾啊,不同的组合价格不同而已

能不能把不同组合看成一个整体,然后转化成背包问题???呵呵
不知道可不可行
何鲁青 2005-01-21
  • 打赏
  • 举报
回复
有点意思
hellolongbin 2005-01-21
  • 打赏
  • 举报
回复
(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
merkey2002 2005-01-21
  • 打赏
  • 举报
回复
啊,太難,想不出來~
有空再想想
merkey2002 2005-01-21
  • 打赏
  • 举报
回复
樓主,能不能分解成只有單個的?
2A+2B+C+D
分解成
A+B+C+D,A,B
允許這樣分解麼?
Kshape 2005-01-21
  • 打赏
  • 举报
回复
刚思考了一下
觉得:

如果是2,3个字母的情况下
是很容易解决的

还有
必须对用户的输入有一定的限制

不容分解会出差错!
Kshape 2005-01-20
  • 打赏
  • 举报
回复
2A+2B+C+D分解算法问题
-----------------------
请问:你是针对这个算式还是任意算式?

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧