program jm;
var
n,m,i,j:integer;
zy:longint;
w,jq:array [1..25] of integer;
f:array [0..2500]of longint;
function max(a1,b1:longint):longint;
begin
if a1<=b1 then max:=b1
else max:=a1;
end;
procedure bb(b,a:longint);
begin
for i:=1 to m do
f[i-1]:=max(f[i-1],f[n-jq[i]]+a);
end;
{main}
begin
assign(input,’jm.txt’);
assign(output,’jmout.txt’);
reset(input);rewrite(output);
f[0]:=0;
readln(n,m);
for i:=1 to m do readln(jq[i],w[i]);
for j:=1 to m do bb(n,(w[j]*jq[j]));
writeln(f[m-1]);
readln;
close(input);close(output);
end.
用样例计算出的结果老是2000,晕啊,请问是什么问题?
另外,这是别人的程序:
program jm;
type xy=record
x,y:longint;
end;
var i,j,n,m,k:longint;
a:array[1..30] of xy;
f:array[0..30,0..30002] of longint;
function max(a,b:longint):longint;
begin
if a>b then
max:=a
else max:=b;
end;
begin
readln(n,m);
for i:=1 to m do
readln(a[i].x,a[i].y);
for i:=1 to m do
for j:=1 to n do
if j>=a[i].x then
f[i,j]:=max(f[i-1,j-a[i].x]+a[i].x*a[i].y,f[i-1,j])
else
f[i,j]:=f[i-1,j];
writeln(f[m,n]);
end.
请问这段程序中
for i:=1 to m do
for j:=1 to n do
if j>=a[i].x then
f[i,j]:=max(f[i-1,j-a[i].x]+a[i].x*a[i].y,f[i-1,j])
else
f[i,j]:=f[i-1,j];
是什么意思?谁能给我详细讲一下啊,谢谢了
还有为什么要从1到n??
这不就完了:
var n,m,i,j:longint;
f,t:array[0..30000]of longint;
a:array[0..30000]of longint;
begin
readln(n,m);
for i:=1 to m do
begin
readln(t[i],f[i]);
f[i]:=f[i]*t[i];
end;
for i:=1 to m do
for j:=n downto t[i] do
if a[j]<a[j-t[i]]+f[i] then a[j]:=a[j-t[i]]+f[i];
write(a[n]);
end.
参见背包就将