动规多重背包
本文参考代码随想录
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了
#include<bits/stdc++.h>
using namespace std;int main(){int bagSize, n;cin >> bagSize >> n;vector<int> weights(n);for(int i = 0; i < n; i++) cin >> weights[i];vector<int> values(n);for(int i = 0; i < n; i++) cin >> values[i];vector<int> nums(n);for(int i = 0; i < n; i++) cin >> nums[i];vector<int> dp(bagSize + 1, 0);for(int i = 0; i < n; i++){for(int j = bagSize; j >= weights[i]; j--){for(int k = 1; k <= nums[i] && j >= k * weights[i]; k++){dp[j] = max(dp[j], dp[j - k * weights[i]] + k * values[i]);}}}cout << dp[bagSize];return 0;
}