Acwing #3(完全背包问题)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/i_meteor_shower/article/details/100748967

点击打开题目链接


完全背包于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;
	}
} 

猜你喜欢

转载自blog.csdn.net/i_meteor_shower/article/details/100748967