算法导论的第一个动态规划问题--钢条切割
我们知道钢条的长度和价格为:
长度i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
价格pi | 1 | 5 | 8 | 9 | 10 | 17 | 17 | 20 | 24 | 30 |
书上的两种方法已经很清楚,这里主要说一下课后练习里面15-3钢条成本加上切割成本,即要切割的次数最少。15-4返回切割方案
#include<fstream> #include<iostream> using namespace std; int main() { int const N = 11; int P[N] = { 0,1,5,8,8,10,17,17,20,24,30 }; //钢条长度对应的价格 int const length = 7; //待切割的钢条长度 int r[length+1] = { 0 },num[length+1] = { 0 };//数组r记录自底向上的每次钢条的最大价格,数组num记录切割次数 int s[length + 1] = { 0 };//记录第一段钢条的最优切割长度 for (int j = 1; j <= length; j++) { int q = -1,index=0; for (int i = 1; i <= j; i++) { if (q < P[i] + r[j - i]) { q = P[i] + r[j - i]; index = j - i; s[j] = i; } if (q == P[i] + r[j - i]) { if (num[j - i] > num[index]) { index = j - i; s[j] = i; } } } if (index == 0) num[j] == 0; else num[j] = num[index] + 1; r[j] = q; } // for (int i = 1; i <= length; i++) // { // cout << num[i] << endl; // } int n = length; while (n > 0) { cout << s[n] << " "; n = n - s[n]; } system("pause"); return 0; }