算法知识-背包dp

一.01背包

1.01背包模板题

T538725 【模板】01背包 - 洛谷

题意:总体积有V,每个物品都有wi价值,和vi体积,在不超过V时,让总价值最大

解决方案:

状态:dpij表示1到i物品自由选择,容量不超过j的情况下的最大价值

状态转移:

(1)不要i号物品,dpi-1j

(2)要i号物品,dpi-1j-v\[i]+wi

上面两个值,二者取大

通过观察状态转移方程,我们发现,每个格子依赖它的上面的格子,和它的上面左边的格子

所以我们的遍历顺序为从上往下,从左往右

初始状态:

根据依赖,我们需要初始化第一行的格子,dp0j,那么选择0号物品,即为不选物品(因为物品编号从1开始),那么价值为0,则dp0j=0;

cpp 复制代码
int f1(vector<int>& w, vector<int>& v,int V,int n) {
	vector<vector<int>>dp(n + 1, vector<int>(V + 1, 0));
	//初始状态dp[0][j]=0

	//dp[i][j]:1-i号物品任意选择,容量不超过j的最大价值
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j <= V; j++) {
			//不要i号物品
			dp[i][j] = dp[i - 1][j];
			//选择i号物品
			if (j - v[i] >= 0) {
				dp[i][j] = max(dp[i][j], dp[i - 1][j - v[i]] + w[i]);
			}
		}
	}

	return dp[n][V];
}

状态压缩:

由于我们发现,每个格子依赖,上方,和左上方,所以我们只需要从上往下,从右往左更新

cpp 复制代码
int f2(vector<int>& w, vector<int>& v, int V, int n) {
    vector<int>dp(V + 1, 0);
	//初始状态dp[0][j]=0
	//dp[i][j]:1-i号物品任意选择,容量不超过j的最大价值
	for (int i = 1; i <= n; i++) {
		for (int j = V; j >=0; j--) {
			//不要i号物品
			//选择i号物品
			if (j - v[i] >= 0) {
				dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
			}
		}
	}

	return dp[V];
}
相关推荐
爱喝雪碧的可乐12 分钟前
MATLAB
开发语言·算法·matlab
叼烟扛炮42 分钟前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers1 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
Rabitebla2 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi2 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅2 小时前
算法(1) 动态规划
算法·动态规划
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
octopus_c4 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
老师我太想进步了202619 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志7832419 小时前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法