动态规划-钢条切割
2017-03-10 23:09
113 查看
一、问题描述
一家公司购买长钢条,将其切割成短钢条出售,切割本身没有成本,长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。如一个Pi如下:长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
价格Pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
对于上述价格表样例,我们可以观察所有最优收益值Ri及对应的最优解方案:
R1 = 1,切割方案1 = 1(无切割)
R2 = 5, 切割方案2 = 2(无切割)
R3 = 8, 切割方案3 = 3(无切割)
R4 = 10, 切割方案4 = 2 + 2
R5 = 13, 切割方案5 = 2 + 3
R6 = 17, 切割方案6 = 6(无切割)
R7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3
R8 = 22, 切割方案8 = 2 + 6
R9 = 25, 切割方案9 = 3 + 6
R10 = 30,切割方案10 = 10(无切割)
更一般地,对于Rn(n >= 1),我们可以用更短的钢条的最优切割收益来描述它:
Rn = max(Pn, R1 + Rn-1, R2 + Rn-2,...,Rn-1 + R1)
首先将钢条切割为长度为i和n - i两段,接着求解这两段的最优切割收益Ri和Rn - i,(每种方案的最优收益为两段的最优收益之和),由于无法预知哪种方案会获得最优收益,我们必须考察所有可能的i,选取其中收益最大者
源码实现
int Steel(int* length, int* price, int N) { int i, j; memset(dp, 0, sizeof(dp)); for(i = 1; i <= N; i++) { int p = price[i]; for(j = 0; j <= i; j++) { p = max(p, dp[j] + dp[i-j]); } dp[i] = p; } return dp ; }
相关文章推荐
- 算法导论--动态规划(钢条切割)
- 钢条切割(动态规划)
- 【动态规划】钢条切割
- 钢条切割-动态规划
- 算法导论---------动态规划之钢条切割
- 算法导论-动态规划-钢条切割
- [置顶] 动态规划之切割钢条
- 【动态规划】钢条切割问题
- [算法学习笔记]动态规划之钢条切割问题
- 算法导论-第15章-动态规划-15.1 钢条切割问题
- 动态规划-钢条切割
- 算法导论程序35--动态规划(钢条切割)
- 动态规划 钢条切割问题
- 算法导论:第15章 动态规划_1钢条切割
- 算法导论 动态规划之钢条切割
- 算法导论-动态规划-钢条切割
- 动态规划----切割钢条
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- 动态规划 钢条切割问题的朴素解法
- 动态规划-钢条切割