蓝桥杯备考----》完全背包模板

其实这个完全背包的步骤和01背包也是差不多滴,不过他有一些优化是我们必须要说一说的

老样子,我们先定义一下状态表示

step1: f[i][j]表示从1到i个物品里选出体积不超过j的最大价值

step2:状态转移方程

写成一行就是

我们再写一下f[i][j-v[i]]的表达式

可以推出f[i][j]其实就是等于max(f[i-1][j],f[i][j-v[i]+w[i])

这就是我们优化后的状态转移方程,很简单

step3:初始化,全部初始化为0

step4:结果就存在f[n][V]里

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1010;
int n,V;
int v[N],w[N];
int f[N][N];
int main()
{
	cin >> n >> V;
	for(int i = 1;i<=n;i++)
	{
		cin >> v[i] >>  w[i];
	}
	for(int i = 1;i<=n;i++)
	{
		for(int j = 0;j<=V;j++)
		{
			f[i][j] = f[i-1][j];
			if(j>=v[i])
			{
				f[i][j] = max(f[i][j],f[i][j-v[i]]+w[i]);
			}
		}
	}
	cout << f[n][V] << endl;
	
	
	
	
	return 0;
}

嗯,我们还需要想一想这个代码怎么进行空间优化可以看到,我们更新一维数组的时候,我们需要当前位置和左边位置的元素,所以我们必须得先把左边位置更新出来才行,所以我们必须从左往右更新才正确

优化代码

cpp 复制代码
#include <iostream>
using namespace std;
const int N = 1010;
int n,V;
int v[N],w[N];
int f[N];
int main()
{
	cin >> n >> V;
	for(int i = 1;i<=n;i++)
	{
		cin >> v[i] >>  w[i];
	}
	for(int i = 1;i<=n;i++)
	{
		for(int j = v[i];j<=V;j++)
		{
				f[j] = max(f[j],f[j-v[i]]+w[i]);
		}
	}
	
	cout << f[V];
	
	
	
	
	return 0;
}

好的好的,那我们来继续做一下第二问

step1:定义状态表示 f[i][j]表示的是从1到i个物品里选出恰好体积为j的物品的最大价值

step2:定义状态表示,和上面的一样

step3:初始化,全部初始化为负无穷,因为我们要用到max,不能让坏值影响我们的推导

并单独把f[0][0]设置为0

step4:答案如果存在的话就存在f[n][V]

cpp 复制代码
#include <iostream>
#include <cstring>
using namespace std;
const int INF = -0x3f3f3f3f; 
const int N = 1010;
int n,V;
int v[N],w[N];
int f[N];
int main()
{
	cin >> n >> V;
	memset(f,-0x3f3f3f3f,sizeof(f));
	for(int i = 1;i<=n;i++)
	{
		cin >> v[i] >> w[i];
	}
	f[0] = 0;
	for(int i = 1;i<=n;i++)
	{
		for(int j = v[i];j<=V;j++)
		{
		   f[j] = max(f[j],f[j-v[i]]+w[i]);
		}
	}
	if(f[V]<0) cout << 0 << endl;
	else cout << f[V] << endl;
	
	
	return 0;
}
相关推荐
野蛮人6号1 小时前
力扣热题100道之238除自身以外数组的乘积
算法·leetcode·职场和发展
程序员小远3 小时前
如何编写自动化测试用例?
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
阿啄debugIT6 小时前
HashMap为什么线程不安全? ConcurrentHashMap如何保证线程安全? AQS如何实现锁的获取与释放?用男女关系进行解释,一看就懂
经验分享·职场和发展·系统架构·软件工程·1024程序员节
西阳未落14 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
吃着火锅x唱着歌20 小时前
LeetCode 668.乘法表中第k小的数
算法·leetcode·职场和发展
小欣加油1 天前
leetcode 844 比较含退格的字符串
算法·leetcode·职场和发展
静若繁花_jingjing1 天前
面试_场景方案设计_联系
面试·职场和发展