动态规划算法,背包问题
来源:互联网 发布:mac版的visual studio 编辑:程序博客网 时间:2024/05/21 06:32
什么是动态规划算法?
从终点向始点求最大(小)值
-----------------------------------------------
例子分析:
1、完全背包问题
2、0-1背包问题
-----------------------------------------------
完全背包问题:
有一个徒步旅行者,其可携带物品重量的限度为a 公斤,设有n 种物品可供他选择装入包中。已知每种物品的重量及使用价值(作用),问此人应如何选择携带的物品(各几件),使所起作用(使用价值)最大?
==========================分页线===============================
当 k=1 时, f1(y) =c1x1 (因为只装1种物品)
当1<k≤n 时,其递推关系如下:
设:akxk为装有第k件物品的重量(其中 0≤akxk≤ y ),此时还剩y -akxk(公斤)空间,需要装前k-1 种物品,如果采取最优策略,则得到的最大价值为fk-1(y - akxk) ,因此总的价值为:
ckxk +fk-1(y - akxk)
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
==========================分页线===============================
贴源码前再回顾下公式:
贴源码(递归方式):
// 动态价值表,每一项对应包当前所能装入的最优值VT[n+1][a+1] = {0};// a[k] 指第k件物品的重量// c[k]<span style="white-space:pre"></span>指第k件物品的价值int RecursionBag(int k, int y)<span style="white-space:pre"></span>//<span style="white-space:pre"></span>资源数,包容量{<span style="white-space:pre"></span>if(k == 0 || y == 0)<span style="white-space:pre"></span>return 0;<span style="white-space:pre"></span>if(k == 1)<span style="white-space:pre"></span>return c[1]*(y/a[1]);<span style="white-space:pre"></span>if(VT[k][y] != 0)<span style="white-space:pre"></span>return VT[k][y];<span style="white-space:pre"></span>if(y >= a[k])<span style="white-space:pre"></span>{<span style="white-space:pre"></span>VT[k][y] = max(c[k]*x[k] + RecursionBag(k-1, y-a[k]*x[k])); // 0 <= x[k] <= y/a[k],此处伪代码<span style="white-space:pre"></span>}<span style="white-space:pre"></span>else<span style="white-space:pre"></span>{<span style="white-space:pre"></span>VT[k][y] = RecursionBag(k-1, y);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>return VT[k][y];}
0-1背包问题:
0-1背包是完全背包的一种特殊形式,完全背包没件物品数量可以取
0,1,2,3...n,而0-1背包物品数量只能去0,1。
所以,0-1背包问题照样用完全背包方式求解,只是在
VT[k][y] = max(c[k]*x[k] + RecursionBag(k-1, y-a[k]*x[k]));这一步
// 0 <= x[k] <= y/a[k]改为
// 0 <= x[k] <= 1
0 0
- 动态规划算法,背包问题
- 算法-动态规划-背包问题
- 背包问题的动态规划算法
- python 版 动态规划 背包问题算法
- 背包问题 动态规划和回溯算法
- 背包问题:动态规划和贪心算法
- 01背包问题的动态规划算法
- 动态规划算法之01背包问题
- [算法]动态规划之背包问题
- 动态规划算法-解决01背包问题
- 【算法系列-5】动态规划-背包问题
- 算法面试---01背包问题---动态规划
- 动态规划算法之01背包问题
- 算法/动态规划/knapsack0-1背包问题
- 0-1背包问题动态规划算法
- 动态规划 背包问题
- 【动态规划】背包问题
- 动态规划-背包问题
- 认识自己——恐惧的奴隶3:妈妈
- 适配器模式
- js数组的操作
- 推职场社交App满足了谁的需求
- Android 中的DisplayMetrics类的用法
- 动态规划算法,背包问题
- 朝花夕拾----新组件的学习和使用
- 安卓笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑结果)
- 简明 Git 命令速查表
- WordPress网站主题社交登录集成服务
- 【转】传值和传地址
- sqlite数据库修改及升级
- C7,c8
- 关于UNITY5.0和高通AR4.2.3在手机上白屏的问题