您的位置:首页 > 其它

混合背包(动态规划)

2016-04-08 21:47 316 查看
Description背包体积为V
,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限
, 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?Input第一行两个数V,N下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=0表示数量无限Output1个数Ans表示所装物品价值的最大值Sample Input
10 3

2 1 0

3 3 1

4 5 4
Sample Output
11



解题思路:f[j]表示一定种类物品在容量为j的背包里的最大价值,根据题意分别处理,循环为:1<=i<=n

若是完全背包,状态转移方程为:f[j]=max{f[j],f[j-w[i]]+c[i]}(w[i]<=j<=m)若是多重背包,状态转移方程为:f[k]=max{f[k],f[k-w[i]]+c[i]}(1<=j<=p[j],m>=k>=w[i])程序:var
n,m,i,j,k:longint;
w,c,p:array[0..30]of longint;
f:array[0..200]of longint;function max(x,y:longint):longint;
begin
if x>y then
exit(x);
exit(y);
end;begin
readln(m,n);
for i:=1 to n doreadln(w[i],c[i],p[i]);
for i:=1 to n do
if p[i]=0 thenbeginfor j:=w[i] to m dof[j]:=max(f[j],f[j-w[i]]+c[i]);end
elsebeginfor j:=1 to p[i] dofor k:=m downto w[i] dof[k]:=max(f[k],f[k-w[i]]+c[i]);end;
writeln(f[m]);
end.版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v9wo.html
转载时必须以链接形式注明原始出处及本声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: