多重背包问题

这里讲一讲多重背包问题

有n种物品,背包的容量为V,接下来给出每个物品的重量w[i],价值v[i],数量c[i],求最大的价值

有了01背包和完全背包的基础,这里就不难了

显然dp方程为

dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i])    (j-k*w[i]>=0 && 0<=k<=c[i])

这里就相当于01背包了,把每个物品有c[i]个看作有c[i]个i号物品

这不就是赤裸裸的01背包了吗?

这里也要倒序

贴代码

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring> 
using namespace std;
int n,V,dp[6010],v[6005],w[6005],c[6005];
int main()
{
    scanf("%d %d",&n,&V); 
    for(int i=1;i<=n;i++)
    {
        scanf("%d %d %d",&w[i],&v[i],&c[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=V;j>=w[i];j--)
        {
            for(int k=0;k<=c[i] && j-k*w[i]>=0;k++)
            {
                dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
            }
        }
    }
    printf("%d
",dp[V]);
}
原文地址:https://www.cnblogs.com/wzrdl/p/9771586.html