pascal石子归并 石子归并一:给出n堆石子的重量W1,W2.WN,要求你合并其中的任意两堆或者n堆(n>=2),求出所有经过合并能够得到的重量值.程序Procedure DP_stone1(n:longint);var I,j,total:longint;beginf[0]:=tru
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/18 15:31:40
pascal石子归并 石子归并一:给出n堆石子的重量W1,W2.WN,要求你合并其中的任意两堆或者n堆(n>=2),求出所有经过合并能够得到的重量值.程序Procedure DP_stone1(n:longint);var I,j,total:longint;beginf[0]:=tru
pascal石子归并
石子归并一:给出n堆石子的重量W1,W2.WN,要求你合并其中的任意两堆或者n堆(n>=2),求出所有经过合并能够得到的重量值.
程序
Procedure DP_stone1(n:longint);
var I,j,total:longint;
begin
f[0]:=true;
total:=sum;{所有石子的总和}
for j:=0 to n do
for i:=total-w[i] downto 0 do
if f[i]=true then f[i+w[j]]:=true
end;
我想问一下倒数第二行的f【i】电脑怎么知道是不是正确的,他不是只给了f0的和f(total)的值吗
pascal石子归并 石子归并一:给出n堆石子的重量W1,W2.WN,要求你合并其中的任意两堆或者n堆(n>=2),求出所有经过合并能够得到的重量值.程序Procedure DP_stone1(n:longint);var I,j,total:longint;beginf[0]:=tru
这里用倒推保证是正确的.、
for j:=0 to n do
for i:=total-w[i] downto 0 do
if f[i]=true then f[i+w[j]]:=true
如果写
for j:=0 to n do
for i:=0 to total-w[i] do
if f[i]=true then f[i+w[j]]:=true
就会出现f[i+w[i]]因为f[i]是true,再次循环外层的j时,f[i+w[i]+w[i]]=true的情况(这就是完全背包了,这里不讨论)
至于楼主的问题.摆脱,外层还有个表示j循环呢、.j=k时会求出前k个石子可以合并出哪些