混合背包(动态规划)

来源:互联网 发布:caffe python 安装 编辑:程序博客网 时间:2024/05/02 04:41

Description

背包体积为V,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限, 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?

Input

第一行两个数V,N下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=0表示数量无限

Output

1个数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 thenexit(x);
    exit(y);
end;

begin
  readln(m,n);
  for i:=1 to n do
   readln(w[i],c[i],p[i]);
  for i:=1 to n do
    if p[i]=0 then
     begin
       for j:=w[i] to m do
        f[j]:=max(f[j],f[j-w[i]]+c[i]);
     end
    else
     begin
       for j:=1 to p[i] do
         for k:=m downto w[i] do
          f[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
转载时必须以链接形式注明原始出处及本声明。
0 0