0-1背包问题

哎嗨我来了

前置知识:DP

DP

DP的推理建立在一个数组上

DP也是分一维二维的,一维DP也就是只有两个状态的DP,二维则有三个状态(如有物品个数、背包容量,价值),其中两个做被拆分的对象,一个做状态下的值

背包问题

上面给出的那篇文章举的那个栗子就是典型的0-1背包问题,具体的拆分步骤已经给出,这里想说的是,0-1背包问题实际上就是把一些有价值有体积(或重量)一个容量给定的背包内(也可以是一个类似背包的东西),求可以装的最大值。

这时候就可以用DP求解,先观察,他可以分成规模更小的问题,符合重叠子问题,至于最优子结构嘛......这个有点难证明,先放一放,他为什么没有后效性,别问我,我也不知道看上面给出的文章你就知道了。

有人就问了:"那么既然是动态规划,那肯定就比枚举要快,但是说了那么一大篇,我还不知道它是怎么推的呢?"别急别急,这就说。

动规有一个状态转移方程,这就是动态规划的核心,没它不行,其他代码只是浮云为了迎合题目要求做的一些加工而已,但是,状态转移方程也会变欧~最长不下降子序列有它的转移方程,最长公共子序列也有一个转移方程,同理,背包问题也有他的转移方程,而且,就算它是背包问题的转移方程,它也会根据不同的题目的条件摇身一变(当然不会变得太离谱),变成一个改装的核心。

那么背包问题的转移方程的改装也是建立在模板背包的转移方程的基础上的改装,所以模板还是要学习滴~

废话不多说了,先看看背包问题的"三元素":重量(背包重量),价值,物品个数,因为求的是价值,所以重量和物品个数做被分成子问题的对象,价值做状态下的值,不多说了,现在就上代码。

就知道你们想要这个

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m,dp[1001][1001],v[1001],h[1001];//dp[i][j]表示在前i个物品中选出一些装入容量为j的背包里可获得的物品最大值 
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>h[i]>>v[i];//输入 
	}
	for(int i=1;i<=m;i++){//枚举所有物品 
		for(int j=1;j<=n;j++){//枚举背包容量 
			if(h[i]<=j){//装得下的情况
				dp[i][j]=max(dp[i-1][j],dp[i-1][j-h[i]]+v[i]);//要么就装,要么就不装,不装的情况就是直接照搬上一个物品的最大值,装的话就是找到减去当前物品重量的背包的价值最大值加上当前物品的价值 
			}
			else dp[i][j]=dp[i-1][j];//装不下就只能照搬上一个物品的最大值 
		}
	}
	cout<<dp[m][n];
}
相关推荐
m0_504135302 小时前
代码随想录算法训练营第六十一天 | floyd算法
算法
xin007hoyo6 小时前
算法笔记.染色法判断二分图
数据结构·笔记·算法
এ᭄画画的北北8 小时前
力扣-234.回文链表
算法·leetcode·链表
八股文领域大手子9 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
__lost9 小时前
C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)
算法·图论·最小生成树·prim算法
wuqingshun31415910 小时前
蓝桥杯 11. 打印大X
数据结构·算法·职场和发展·蓝桥杯·深度优先
Blossom.11811 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
A林玖11 小时前
【机器学习】朴素贝叶斯
人工智能·算法·机器学习
六边形战士DONK11 小时前
神经网络基础[损失函数,bp算法,梯度下降算法 ]
人工智能·神经网络·算法
wuqingshun31415912 小时前
蓝桥杯 2. 确定字符串是否是另一个的排列
数据结构·c++·算法·职场和发展·蓝桥杯