题目链接:点击这里
多重背包问题描述:有 种物品和一个容量为 的背包。第 种物品最多有 件可用,每件耗费的空间是 ,价值是 。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。
这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可。
因为对于第 种物品有 种策略:取 件,取 件……取 件。
令
表示前
种物品恰放入一个容量为
的背包的最大价值,则有状态转移方程:
复杂度是 。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int v[maxn], w[maxn], s[maxn]; //v物品体积,w物品价值,s物品数量
int dp[maxn];
int main()
{
int N, V;
scanf("%d%d", &N, &V);
for(int i = 1; i <= N; ++i)
scanf("%d%d%d", &v[i], &w[i], &s[i]);
for(int i = 1; i <= N; ++i)
{
for(int j = V; j >= v[i]; --j)
{
for(int k = 0; k <= s[i] && k*v[i] <= j; ++k)
{
dp[j] = max(dp[j], dp[j-k*v[i]]+k*w[i]);
}
}
}
printf("%d", dp[V]);
return 0;
}