01背包问题
01背包问题
1.01背包问题介绍
01背包是指有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
01背包中的“01”是指每个物品只能选或不选,也就是选1次和选0次。
2.01背包问题例题
题目描述
一个旅行者有一个最多能装
输入
第一行:两个整数,M(背包容量,
第
输出
仅一行,一个数,表示最大总价值。
输入样例
10 4 2 1 3 3 4 5 7 9
输出样例
12
注:本题来自AcWing题库第2题
3.01背包问题思路
Dp一般分为两个思考部分
第一个是状态表示,也就是
在01背包问题中,
第二个是状态计算,也就是状态转移方程。
前一阶段的终点就是后一阶段的起点,对前一阶段的状态作出某种决策,产生后一阶段的状态,这种关系描述了由k阶段到k+1阶段状态的演变规律,称为状态转移方程。
大致是这个意思,具体可能有错误
01背包问题可以把
注:在集合的划分上一般要做到不重不漏,只有个别情况不用
4.01背包问题代码
#include<iostream> #define MAXN 1005 using namespace std; int v[MAXN],w[MAXN],f[MAXN][MAXN]; int main(){ int n,m; cin>>m>>n; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++){ for(int j=0;j<=m;j++){ f[i][j]=f[i-1][j]; if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); } } cout<<f[n][m]; return 0; }
5.01背包问题优化
我们通过观察可以得出,
状态转移方程:
6.代码(优化)
#include<iostream> using namespace std; const int MAXN=1005; int v[MAXN],w[MAXN],f[MAXN]; int main(){ int n,m; cin>>m>>n; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; for(int i=1;i<=n;i++) for(int j=m;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+w[i]); cout<<f[m]; return 0; }
完awa~
如果觉得好就点个赞吧,您的支持就是本蒟蒻最大的动力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】