Description
设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
Input
第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2..N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。
Output
仅一行,一个数,表示最大总价值。
Sample Input
12421334579
Sample Output
15
题解:这道题可以用回溯的方法做, if j>=w[i] then
f[i,j]:=max(f[i-1,j-w[i]*k]+v[i]*k,f[i,j]);
f[i,j]是记录最大总价值。
var n,t,i,j,k:longint;
f:array[0..1000,0..1000] of longint;
w,v:array[0..1000] of longint;
functionmax(x,y:longint):longint;
beginif x>y then max:=x
else max:=y;
end;
begin
readln(t,n);
for i:=1to n dobegin
readln(w[i],v[i]);
end;
for i:=1to n dofor j:=0to t dobegin
f[i,j]:=f[i-1,j];
for k:=0to j div w[i] doif j>=w[i] then
f[i,j]:=max(f[i-1,j-w[i]*k]+v[i]*k,f[i,j]);
end;
writeln(f[n,t]);
end.