递归:分治法与动态规划
来源:互联网 发布:厦门小青柑普茶淘宝 编辑:程序博客网 时间:2024/06/06 03:44
动态规划、分治法和贪心法都是利用求解子问题,而后利用子问题求解更上层问题,最终获得全局解决方案的方法。但是三者的应用场景和性质却存在着极大的不同:
1. 分治法
分治法的精髓:
分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;
很容易将分治法与动态规划相混淆,但两者却有着本质上的差异。分治法采用的是递归的思想来求解问题,两个分解的子问题独立求解,其之间无任何的重叠。而上一层问题只需要对两个子问题进行一定的合并即可得到答案。即s(t)= s(sub1)+s(sub2)
,而s(sub1)
和s(sub2)
之间无任何重叠。
1.1 使用分治法求数组中的最大值
函数将数组a[1],……,a[r]分成两部分,分别求出每部分的最大元素(递归地),并返回较大的那一个作为整个数组的最大元素。
Item max(Item a[],int l,int r) { Item u,v; int m=(l+r)/2; if (l==r) return a[l];//如果只有一个元素,就返回它 u=max(a,l,m); v=max(a,m+1,r); if(u>v) return u; else return v;}
2. 动态规划
该种方法较为复杂,但十分有用和高效,其核心性质是当前问题的答案s(t)并不能单独由s(t-1)求得,还有可能需要使用到s(1)...s(t-1)
。具体需要使用到那些,是由问题本身的性质所决定的(常常是一个约束,或变相的约束)。
动态规划分解后的子问题相互间有联系,有重叠的部分。
2.1 动态规划与01背包问题
01背包问题:一个背包总容量为V,现在有N个物品,第i个 物品体积为weight[i],价值为value[i],现在往背包里面装东西,怎么装能使背包的内物品价值最大?
动态规划先找出子问题,我们可以这样考虑:在物品比较少,背包容量比较小时怎么解决?用一个数组f[i][j]表示,在只有i个物品,容量为j的情况下背包问题的最优解,那么当物品种类变大为i+1时,最优解是什么?第i+1个物品可以选择放进背包或者不放进背包(这也就是0和1),假设放进背包(前提是放得下),那么f[i+1][j]=f[i][j-weight[i+1]+value[i+1]
;如果不放进背包,那么f[i+1][j]=f[i][j]
。
这就得出了状态转移方程: f[i+1][j]=max(f[i][j],f[i][j-weight[i+1]+value[i+1])
。
完整代码:
#include<iostream>using namespace std;#define V 1500unsigned int f[10][V];//全局变量,自动初始化为0unsigned int weight[10];unsigned int value[10];#define max(x,y) (x)>(y)?(x):(y)int main() { int N,M; cin>>N;//物品个数 cin>>M;//背包容量 for (int i=1;i<=N; i++) { cin>>weight[i]>>value[i]; } for (int i=1; i<=N; i++) for (int j=1; j<=M; j++) { if (weight[i]<=j) { f[i][j]=max(f[i-1][j],f[i-1][j-weight[i]]+value[i]); } else f[i][j]=f[i-1][j]; } cout<<f[N][M]<<endl;//输出最优解}
- 递归:分治法与动态规划
- 分治与递归、动态规划、贪心
- 分治法与动态规划
- 递归+分治+贪心+动态规划
- 分治与动态规划
- 递归分治与动态规划--上台阶的问题
- 五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)
- 分治法与动态规划小结
- 动态规划与分治法的小结
- 分治法、动态规划与贪心算法
- 递归,递推,分治,贪心,动态规划......
- 整数划分 (递归、分治、动态规划)
- 递归与动态规划
- 递归与动态规划
- 分治算法,动态规划,贪婪算法以及递归之间的区别与联系
- 分治法,动态规划对比
- 分治法,动态规划区别
- 递归与分治法
- Linux文件及目录命名规则
- 通过aidl实现传送远程服务中的对象
- Http相关 --概念
- C++笔记——类的继承和访问控制
- MFC从资源文件获取png图片
- 递归:分治法与动态规划
- online_judge_1151
- 【杭电】[5499]SDOI
- Linux下tomcat的安装配置
- 图---Floyd
- 算法设计题2.34~2.36-线性表-第2章-《数据结构习题集》-严蔚敏吴伟民版
- 树及二叉树
- Arch安装常见的问题
- iOS开发实践之FMDB