动态规划 钢条切割
2017-05-11 17:02
260 查看
这是算法导论动态规划的一个例子,自己实现了一下~
给定一个长度为n英寸的钢条和一个价格表Pi(i=1,2…n),求切割钢条方案,使得销售收益Rn最大。注意,如果长度为n的钢条价格Pn足够大,则最优解可能就不需要切割。
分析:
代码如下:
给定一个长度为n英寸的钢条和一个价格表Pi(i=1,2…n),求切割钢条方案,使得销售收益Rn最大。注意,如果长度为n的钢条价格Pn足够大,则最优解可能就不需要切割。
分析:
代码如下:
#include<iostream> #include<vector> #include<algorithm> using namespace std; //recursion int max_profit(const vector<int>& v, int n) { if (n <= 0) return 0; int ret = 0; for (int i = 1; i <= n; i++) { ret = max(ret, max_profit(v, n-i) + v[i]); } return ret; } //dp1 Top-down int max_profit(const vector<int>& v, int n, vector<int>& tmp) { if (n == 0) return 0; if (tmp > 0) return tmp ; int ret = 0; for (int i = 1; i <= n; i++) { ret = max(ret, v[i] + max_profit(v, n - i, tmp)); } tmp = ret; return ret; } int max_profit_dp1(const vector<int>& v, int n) { vector<int> tmp(n + 1, 0); //用于保存之前的结果 if (n <= 0) return 0; return max_profit(v, n, tmp); } //dp2 Bottom-up int max_profit_dp2(const vector<int>& v, int n) { if (n <= 0) return 0; vector<int> tmp(n + 1, 0); //用于保存之前的结果 for (int i = 1; i <= n; i++) { int ret = 0; for (int j = 1; j <= i; j++) { ret = max(ret, v[j] + tmp[i - j]); } tmp[i] = ret; } return tmp ; } int main() { vector<int> v(11, 0); v[1] = 1; v[2] = 5; v[3] = 8; v[4] = 9; v[5] = 10; v[6] = 17; v[7] = 17; v[8] = 20; v[9] = 24; v[10] = 30; cout << max_profit(v, 5) << endl; cout << max_profit_dp1(v, 5) << endl; cout << max_profit_dp2(v, 5) << endl; return 0; }
相关文章推荐
- 算法导论 第15章 动态规划:15.1钢条切割
- 动态规划_钢条切割最优策略
- 动态规划之线性动规钢条切割问题
- 动态规划问题之钢条切割
- 动态规划之钢条切割
- 动态规划:钢条切割问题
- 动态规划之钢条切割问题
- 动态规划 ———— 钢条切割到底在切啥?
- 动态规划之切割钢条
- 动态规划之钢条切割
- 动态规划之钢条切割
- 动态规划与钢条切割问题 C++实现
- 动态规划--钢条切割问题
- 算法导论 第15章 动态规划之钢条切割
- 动态规划--钢条切割的C++实现
- 动态规划:钢条切割问题实现
- 算法学习之路:动态规划-钢条切割-java实现
- 算法导论之动态规划:钢条切割
- Python实现动态规划切割钢条问题
- 动态规划--钢条切割