c++算法之动态规划:01背包
什么是动态规划?
动态规划算法(dynamic programing),是一种由递推为基础的比贪心更稳定的一种优化策略,为运筹学的一部分。就是通过以递推为基础的手段非暴力求出最值。
它的总体思想其实就是一个比较过程:假如你有一个数据,它的价值是x,代价为y,如果用动态规划就是和你不加这个元素和你加上这个元素的价值减去他的代价的二值做最值比较。
动态规划的思想用的很多就比如:经济上的盈亏、概率等。
今天有于时间关系,只讲零一背包
1.01背包问题
零一背包是一种经典的有代价和价值两个元素干涉的最值问题.
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,
每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,
由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。
但在程序里需要一个二维数组来表达:
首先,什么是状态?
状态就是这个二维数组 f[i][j] 表示的什么意思,根据动态规划的思想就可以推出结论:f[i][j]就是第i,j个位置上算出来的最优解
可是,问题来啦,咋求这个最优解呢?于是就必须用到我们的递推试,叫做状态转移方程。
f[i][j]=max(f[i][j],f[i][j-w[i]]+c[i]);
其中w[i]是代价,c[i]是价值。
so,上代码:
1 /* 2 这里就直接出滚动数组优化的代码了 3 滚动数组就是把前面没最优化的数据覆盖 4 以达到节省空间的目的。 5 */ 6 #include<iostream> 7 using namespace std; 8 int f[105]; 9 int w[105],c[105]; 10 int main(){ 11 int n,m; 12 cin >> n>>m; 13 for(int i=1;i<=n;i++){ 14 cin >> w[i]>> c[i]; 15 } 16 for(int i=1;i<=n;i++){ 17 for(int j=m;j>=w[i];j--){ 18 f[j]=max(f[j],f[j-w[i]]+c[i]);//滚动数组优化一维 19 } 20 } 21 cout << f[m]; 22 return 0; 23 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)