多重背包问题
题目
有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 M[i] 件可用,每件耗费的
空间是 C[i],价值是 W[i]。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超
过背包容量,且价值总和最大。
思路
比如第i件物品有s个,我可以把相同种类的物品的进行合并,比如我拿出两件合并出一个新的物品,我拿出三件合并出一个新的物品,以此类推,我拿出s个合并出一个新的物品。基于这种思想,我们把第i件的s个物品转换为s种体积各不相同的物品,然后在用01背包的思想,求出最优解,动态转移方程为:
F[i,v] = max{F[i − 1, v − k ∗ C[i]] + k ∗ W[i] | 0 ≤ k ≤ M[i]}
将多重背包转换成0-1背包问题:
第i物体有 s[i]个,这里将其看作体积和价值都相同但不同的物体。即在输入 v [ i ] , w [ i ]时重复输入第i个物体 s[i]次。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int dp[1005];
int main()
{
cin>>n>>m;
while(n--)
{
int v,w,s;
cin>>v>>w>>s;
//每一次输入都可以看作有s个物体的0-1背包问题
while(s--) //每多一次循环相当于多考虑一种物品的情况。
{
for(int j=m;j>=v;j--)
dp[j]=max(dp[j],dp[j-v]+w);
}
}
cout<<dp[m];
return 0;
}