背包问题 (DP)
2016-03-01 18:34
267 查看
利用记忆化数组.记dp[i][j]为根据rec的定义,从第i个物品开始挑选总重小于j时,总价值的最大值.
递推式:
dp[i][j]=0 (j<w[i])
dp[i][j]
dp[i][j]=
max(dp[i+1][j],dp[i+1][j-w[i]]+v[i])
反向:
正向:
另一种:
以这种方式一步步按顺序求出问题的解的方法被称为动态规划,也就是常说的DP.
<<挑战程序设计竞赛>>读后感
递推式:
dp[i][j]=0 (j<w[i])
dp[i][j]
dp[i][j]=
max(dp[i+1][j],dp[i+1][j-w[i]]+v[i])
反向:
int dp[MAX][MAX]; //DP数组 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]); }
正向:
int dp[MAX][MAX]; //DP数组 void solve() //正向循环 { for(int i=0; i<=n; i++){ for(int j=0; j<=W; j++){ if(j<w[i]){ dp[i+1][j]=dp[i+1][j]; } else{ dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]); } } } printf("%d\n",dp [w]); }
另一种:
int dp[MAX][MAX]; //DP数组 void solve() //正向循环 { for(int i=0; i<=n; i++){ for(int j=0; j<=W; j++){ dp[i][j]=max(dp[i+1][j],dp[i][j]); if(j+w[i]<=W){ dp[i+1][j+w[i]]=max(dp[i+1][j+w[i]],dp[i][j]+v[i]); } } } printf("%d\n",dp [w]); }
以这种方式一步步按顺序求出问题的解的方法被称为动态规划,也就是常说的DP.
<<挑战程序设计竞赛>>读后感
相关文章推荐
- kindeditor的简单使用
- html5开发之viewport使用
- Erlang 学习(四) 整数和字符串相互转换
- 关于restful
- Spring框架中SecurityContextHolder类的使用详解(未完待续)
- C 语言资源大全中文版
- Java入门 一些概念及类
- IE 文档模式
- 冒泡排序及算法优化
- Transport(VMDB)error -44:Message
- Centos环境下Mysql5.6的安装
- 华为机试题01(2015部分)
- 中山大学2016年硕士研究生入学考试复试基本分数线
- iOS-将NSString转换成UTF8编码的NSString
- Android Studio 部分快捷键用法
- ios手势识别_拖动,缩放,旋转,点击,手势依赖,自定义手势
- linux 重命名文件和文件夹
- DOS下常用网络命令技巧
- [java] JNLP文件安装
- Git 合并 patch 时的冲突处理一例