标签:
1 program package; 2 const 3 maxm=200;maxn=30; 4 var 5 m,n,j,i:integer; 6 c,w: array[1..maxn] of integer; 7 f:array[0..maxn,0..maxm] of integer; 8 function max(x,y:integer):integer; //求x和y的最大值 9 begin 10 if x>y then max:=x else max:=y; 11 end; 12
13 BEGIN 14 assign(input,‘package.in‘); 15 assign(output,‘package.out‘); 16 reset(input); 17 rewrite(output); 18 readln(m,n); //背包容量m和物品数量n 19 for i:= 1 to n do 20 readln(w[i],c[i]); //每个物品的重量和价值 21 for i:=1 to n do 22 for j:=1 to m do 23 begin // f(i,x)表示前i件物品,总重量不超过x的最优价值 24 if j>=w[i] then f[i,j]:=max(f[i-1,j-w[i]]+c[i],f[i-1,j]) 25 else f[i,j]:=f[i-1,j]; 26 end; 27 writeln(f[n,m]); //f(n,m)为最优解 28 close(input); 29 close(output); 30 END.
使用二维数组存储各子问题时方便,但当maxm较大时不能定义二维数组f,怎么办,其实可以用一维数组。
1 program star_package; 2 var 3 i,j,k,n,m:longint; 4 f:array[0..100000]of longint; 5 w,c:array[0..2000]of longint; 6 begin 7 assign(input,‘package.in‘); 8 assign(output,‘package.out‘); 9 reset(input); 10 rewrite(output); 11 fillchar(f,sizeof(f),0); 12 readln(m,n); //背包容量m和物品数量n 13 for i:=1 to n do 14 readln(w[i],c[i]); //每个物品的重量和价值 15 for i:=1 to n do 16 for j:=m downto w[i] do //这里不能写成for j:=w[i] to m 17 if f[j-w[i]]+c[i]>f[j] then f[j]:=f[j-w[i]]+c[i]; // f(j)表示重量不超过j公斤的最大价值 18 writeln(f[m]); 19 close(input); 20 close(ouptut); 21 end.
标签:
原文地址:http://www.cnblogs.com/vacation/p/5402890.html