【代码随想录】完全背包

题目描述

image

分析

所谓完全背包就是各种物品的数量为无限的情况,这种题其实想一下是比01背包简单的,因为没有了物品数量的限制,往背包里放物品的过程变得更简单直观了。
很容易得到,在完全背包里只能遍历背包容量,而不能遍历物品,因为这时物品是无限的,这样的话我们只需要一边循环,从dp[0]一直遍历到dp[V]即可,而且这直接就是往背包里一个个放物品的过程。
由于只有一遍循环,所以不必担心dp数组被覆盖的问题,而且由于只进行一边循环,所以只能正序遍历dp数组而不能倒序。
复习一下为什么01背包里必须倒序遍历背包空间:
image
其实在01背包里正序遍历应该也不是不行,只不过需要加上visited数组来避免重复放入一个物品的问题,而在完全背包里自然没有这个问题,物品的数量是无限的。
代码如下:

#include<bits/stdc++.h>
using namespace std;
//动态规划:完全背包
 
int main(){
	int N,V;
	cin>>N>>V;
	vector<int> weight;
	vector<int> value;
	int a,b;
	for(int i = 0; i < N; i++){
		cin>>a>>b;
		weight.push_back(a);
		value.push_back(b);
	}
	vector<int> dp(V+1, 0);
	
	for(int j = 0; j <= V; j++){
		for(int i = 0; i < N; i++){
			if(j - weight[i] < 0){
				continue;
			}
			dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
		}
	}
	for(int i = 0; i <= V; i++){
		cout<<dp[i]<<" ";
	}
	cout<<endl;
	cout<<dp[V];
	return 0;
}
posted @ 2024-03-21 00:08  SaTsuki26681534  阅读(3)  评论(0编辑  收藏  举报