Pascal编程潜水员问题 具体如下
答案:1 悬赏:0
解决时间 2021-01-07 12:24
- 提问者网友:孤凫
- 2021-01-06 22:02
Pascal编程潜水员问题 具体如下
最佳答案
- 二级知识专家网友:末日狂欢
- 2021-01-06 23:02
这是明显的动态规划的背包问题,每个汽缸只能用一次。
tot[i,j]表示有i个单位的氧气和j个单位的氮的重量最小值。
明显可以推出tot[i+a[k],j+b[k]]+c[k]即可。
再特判一下i+a[k]的值和j+b[k]的值。
(注意:因为只能取一次,所以要downto,免得加重复了)
比如
for k:=1 to l do
for i:=1 to n do
for j:=1 to m do
这样更新时,在tot[i+a[k],j+b[k]]更新完了后,在后来循环到了i+a[k],j+b[k]时又会再加一次
变得i+a[k]+a[k],j+b[k]+b[k]也会有值,但是这不成立,所以downto,如果不懂可以用三维,加多一维。(如果楼主实在不懂,可以参考背包九讲)
var
n,m,l,i,k,j,be,en:longint;
tb,te,map:array[1..1000] of longint;
tot:array[0..21,0..79] of longint;
begin
readln(n,m);
readln(l);
for i:=1 to l do read(tb[i],te[i],map[i]);
fillchar(tot,sizeof(tot),$7f div 3);
tot[0,0]:=0;
for k:=1 to l do
for i:=n downto 0 do
for j:=m downto 0 do
begin
be:=i+tb[k];
en:=j+te[k];
if (be>n) then be:=n;
if (en>m) then en:=m;
if tot[be,en]>tot[i,j]+map[k] then tot[be,en]:=tot[i,j]+map[k];
end;
writeln(tot[n,m]);
end.
望采纳
tot[i,j]表示有i个单位的氧气和j个单位的氮的重量最小值。
明显可以推出tot[i+a[k],j+b[k]]+c[k]即可。
再特判一下i+a[k]的值和j+b[k]的值。
(注意:因为只能取一次,所以要downto,免得加重复了)
比如
for k:=1 to l do
for i:=1 to n do
for j:=1 to m do
这样更新时,在tot[i+a[k],j+b[k]]更新完了后,在后来循环到了i+a[k],j+b[k]时又会再加一次
变得i+a[k]+a[k],j+b[k]+b[k]也会有值,但是这不成立,所以downto,如果不懂可以用三维,加多一维。(如果楼主实在不懂,可以参考背包九讲)
var
n,m,l,i,k,j,be,en:longint;
tb,te,map:array[1..1000] of longint;
tot:array[0..21,0..79] of longint;
begin
readln(n,m);
readln(l);
for i:=1 to l do read(tb[i],te[i],map[i]);
fillchar(tot,sizeof(tot),$7f div 3);
tot[0,0]:=0;
for k:=1 to l do
for i:=n downto 0 do
for j:=m downto 0 do
begin
be:=i+tb[k];
en:=j+te[k];
if (be>n) then be:=n;
if (en>m) then en:=m;
if tot[be,en]>tot[i,j]+map[k] then tot[be,en]:=tot[i,j]+map[k];
end;
writeln(tot[n,m]);
end.
望采纳
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯