版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
完全背包于01背包类似,但是物品可以取无限次。此题也可用dp[j]表示体积为 j 时最大价值,同时只需将01背包中的 j = V…0改为j = 0…V即可。
对于01背包中从V…0循环是为了保证该值都是由前一个物品的值转移过来,从而保证了第i件物品只取了一次,而完全背包可以取无限次(只要背包容量容许),所以在求第i件物品的dp时,状态转移也可从第i件物品转移过来。
即:
j: v[i]~V
dp[j] = max(dp[j], dp[j-v[i]]+w[i]);
#include <bits/stdc++.h>
using namespace std;
//输入
int N, V;
int v, w;
int dp[1005];
int main()
{
while(cin >> N >> V) {
for(int i = 1; i <= N; i++) {
cin >> v >> w;
for(int j = v; j <= V; j++) {
dp[j] = max(dp[j], dp[j-v] + w);
}
}
cout << dp[V] << endl;
}
return 0;
}
//通过转换为01背包辅助理解为什么变换循环体积次序可以求解完全背包
void test() {
while(cin >> N >> V) {
for(int i = 1; i <= N; i++) {
cin >> v >> w;
for(int j = V; j >= v; j--) {
for(int k = 0; k * v <= j; k++) {
dp[j] = max(dp[j], dp[j-v*k] + w * k);
}
}
}
cout << dp[V] << endl;
}
}