第15章动态规划------算法导论
Posted l2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第15章动态规划------算法导论相关的知识,希望对你有一定的参考价值。
15.1钢条切割
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<ctime> #include<string> using namespace std; int p[1000]{ 0,1,5,8,9,10,17,17,20,24,30 };//钢条价格。长度i的价格为p[i] int ordinary(int *p, int n)//递归法 { if (n == 0) return 0; else { int q = -1; for (int i = 1; i <= n; ++i) { q = max(p[i] + ordinary(p, n - i), q); } return q; } } int top_down_memory(int *p, int n)//动态规划 带备忘的自顶向下法 与递归法类似,只是结果存储起来了 { static int b[1000]; if (n == 0) return 0; if (b[n] != 0) { return b[n]; } else { int q = -1; for (int i = 1; i <= n; ++i) { q = max(p[i] + top_down_memory(p, n - i), q); } b[n] = q; return q; } } int bottom_up_method(int *p, int n)//动态规划 自底向上 把子结果都先求出来,再求总结果 { static int b[1000]; for (int i = 1; i <= n; ++i) { int q=-1; for (int j = 1; j <= i; ++j) { q = max(q, p[j] + b[i - j]); } b[i] = q; } return b[n]; } int bottom_up_method_result(int *p, int n)//动态规划 自底向上 把子结果都先求出来,再求总结果 同时把如何切割求出来 { static int b[1000]; static int s[1000];//切割方案 for (int i = 1; i <= n; ++i) { int q = -1; int ss = -1; for (int j = 1; j <= i; ++j) { if (q < p[j] + b[i - j]) { q = p[j] + b[i - j]; ss = j; } } s[i] = ss; b[i] = q; } return b[n]; } int main() { int n; clock_t start; while (cin>>n) { start = clock(); cout << ordinary(p, n); cout << "ordinary:" << double(clock() - start) << " "; start = clock(); cout << bottom_up_method_result(p, n); cout<< "bottom_up_method_result:" << double(clock()-start) << " "; start = clock(); cout << top_down_memory(p, n); cout << "top_down_memory:"<< double(clock() - start) << endl; } }
以上是关于第15章动态规划------算法导论的主要内容,如果未能解决你的问题,请参考以下文章