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

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

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

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

step2:状态转移方程

写成一行就是

我们再写一下fij-v\[i]的表达式

可以推出fij其实就是等于max(fi-1j,fij-v\[i+wi)

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

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

step4:结果就存在fnV

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:定义状态表示 fij表示的是从1到i个物品里选出恰好体积为j的物品的最大价值

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

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

并单独把f00设置为0

step4:答案如果存在的话就存在fnV

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;
}
相关推荐
moeyui7056 小时前
LeetCode 380:Insert Delete GetRandom O(1) 题解和一些延伸
算法·leetcode·职场和发展
小欣加油7 小时前
leetcode3689最大子数组总值I
c++·算法·leetcode·职场和发展·贪心算法
海梨花8 小时前
字节面试高频算法题
java·算法·面试·职场和发展
小欣加油9 小时前
leetcode121买卖股票的最佳时机
数据结构·c++·算法·leetcode·职场和发展
酉鬼女又兒10 小时前
零基础入门计算机网络:集线器与交换机区别、以太网交换机自学习转发流程及生成树协议STP全解析
服务器·网络·网络协议·tcp/ip·计算机网络·考研·职场和发展
8Qi810 小时前
LeetCode 5:最长回文子串(Longest Palindromic Substring)—— 题解
算法·leetcode·职场和发展·动态规划
8Qi821 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
嵌入式ZYXC1 天前
第3篇:《面试题:I2C为什么要加上拉电阻?阻值怎么选?》
stm32·单片机·嵌入式硬件·面试·职场和发展
sbjdhjd1 天前
面试(5)| 3.5 小时面试复盘第五弹:加班出差 + 客户响应 + 压力面全拆解
经验分享·程序人生·面试·职场和发展·开源·跳槽·求职招聘