大意:
假设有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 n[i] 件可用,每件费用是 c[i] ,价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量, 且价值总和最大。
基本算法
这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改
即可,因为对于第 i 种物品有 n[i]+1 种策略:取 0 件,取 1 件 ... 取 n[i] 件。令 f[i][v] 表示前 i 种物品恰放入一个容量为 v 的背包的最大权值, 则有状态转移方程:
f[i][v] = max{f[i − 1][v − k × c[i]] + k × w[i]} 0 <= k 6<=n[i];
例题:
#include <iostream> using namespace std; int nCases; int nValue, nKind; int value[105], weight[105], bag[105]; int nMultiplePack[105]; int main() { scanf("%d", &nCases); while(nCases--) { memset(nMultiplePack, 0, sizeof(nMultiplePack)); scanf("%d %d", &nValue, &nKind); for(int i=0; i<nKind; ++i) scanf("%d %d %d", &value[i], &weight[i], &bag[i]); for(int i=0; i<nKind; ++i) for(int j=0; j<bag[i]; ++j) for(int k=nValue; k>=value[i]; --k) if(nMultiplePack[k] < nMultiplePack[k-value[i]]+weight[i]) nMultiplePack[k] = nMultiplePack[k-value[i]] + weight[i]; printf("%d\n", nMultiplePack[nValue]); } return 0;}