动态规划
来源:互联网 发布:苹果系统切换windows 编辑:程序博客网 时间:2024/06/18 03:49
动态规划
动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。
状态和状态转移方程
例子:01背包问题
有 n 个价值和重量分别为 v[i] 和 w[i] 的物品和一个容量为 m 的背包,要从中选出总重量不超过 m 的物品放入背包,问所有方案中价值总和的最大值。
输入
n=4
(w,v)={(2,3),(1,2),(3,4),(2,2)}
w=5
输出
7(选择0,1,3号物品)
状态: dp[i][j] 表示考虑前 i 个物品,背包容量为 j 时的最大价值
初始: dp[n][j] = 0
状态转移方程:
![](http://upload-images.jianshu.io/upload_images/3858429-c5179f8292959d2b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
状态转移方程
![](http://upload-images.jianshu.io/upload_images/3858429-38aeec1abd3192cd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
图解
int dp[N][N];void solve(){ for (int i=n-1;i>=0;i--){ for(int j=0;j<=w;j++){ if(j<w[i]) dp[i][j]=dp[i+1][j]; else dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]); } } printf("%d\n",dp[0][w]);}
阅读全文
0 0
- 动态规划!!!动态规划!!!
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- 动态规划
- HDU 1509
- HDU 1387
- 20. 排序--快速排序
- 数论基础
- 一段好玩的python代码--随机生成圆
- 动态规划
- 并查集
- 关于java基本类型变量的思考
- android AsyncChannel机制 --- 异步消息分析
- JAVA,环境变量设置
- 面试算法题解—— 链表中环的入口节点
- 对前台传入的模糊查询字符串进行转义
- 【Java】阿里巴巴Java开发手册V1.2.0
- 在Android Stuido中使用Lint