C++实现算法导论十五章动态规划之钢条分割问题
2014-11-10 14:43
716 查看
#include<iostream> #include<algorithm> #include<utility> #include<vector> using namespace std; //采用普通的递归算法来求解钢条分割的最大的收益 int cut_rod(int *p,const int &n) { if(n==0) return 0; int q=-1; for(int i=1;i<=n;++i) { q=max(q,p[i]+cut_rod(p,n-i)); } return q; } //采用至顶向下的函数的动态规划函数方法来求解该问题 int memoized_cut_rod_aux(int *p,int n,int *r) { if(r >=0) { return r ; } int q=-1; if(n==0) q=0; else { for(int i=1;i<=n;++i) q=max(q,p[i]+memoized_cut_rod_aux(p,n-i,r)); } r =q; return q; } //至顶向下发的主函数 int memoized_cut_rod(int *p,int n) { int r[11]={}; for(int i=0;i<11;++i) r[i]=-1; int q=memoized_cut_rod_aux(p,n,r); return q; } //至顶向上的方法来求解钢条问题 int bottom_up_cut_rod(int *p,int n) { int r[11]={0}; for(int j=1;j<=n;++j) { int q=-1; for(int i=1;i<=j;++i) { q=max(q,p[i]+r[p,j-i]); } r[j]=q; } return r ; } pair< vector<int>,vector<int> > extened_bottom_up__cut_rot(int *p,int n) { pair< vector<int>,vector<int> > result; int r[11]={0}; int s[11]={0}; result.first.push_back(0); result.second.push_back(0); for(int j=1;j<=n;++j) { int q=-1; for(int i=1;i<=j;++i) { //q=-1; //q=max(q,p[i]+r[j-i]) if(q<p[i]+r[j-i]) { q=p[i]+r[j-i]; s[j]=i; } } r[j]=q; result.first.push_back(r[j]); result.second.push_back(s[j]); } return result; } //打印结果值; void print_cut_rod_solution(int *p,int n) { cout<<"最大的收益值为"<<endl; //cout<<"钢条的分割方式为"<<endl; pair< vector<int>,vector<int> > result; result=extened_bottom_up__cut_rot(p,n); cout<<result.first <<endl; cout<<"钢条的分割方式为"<<endl; while(n>0) { //cout<<"钢条的分割方式为"<<endl; cout<<result.second ; n=n-result.second ; cout<<endl; } cout<<endl; cout<<"钢条的分割方式结束"<<endl; } int main() { int price[11]={0,1,5,8,9,10,17,17,20,24,30}; //cout<<cut_rod(price,5)<<endl; cout<< bottom_up_cut_rod(price,8)<<endl; print_cut_rod_solution(price,8); system("pause"); return 0; }
相关文章推荐
- 动态规划之钢条切割问题自底向上发的实现(算法导论第15章)
- 算法:C++实现动态规划中的几个典型问题
- 动态规划与钢条切割问题 C++实现
- 流水线调度问题实现(动态规划基础---------问题取自算法导论)
- 算法导论 第15章 动态规划:15.1钢条切割
- 动态规划--01背包问题 C++实现
- 动态规划之最长公共子序列问题 C++实现
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 动态规划:钢条切割问题实现
- 动态规划--钢条切割的C++实现
- 动态规划之滑雪问题c++实现
- 矩阵链乘法问题(给A1A2A3...An加括号,使之乘法次数最小)动态规划问题C++实现
- 算法导论 第16章 贪心算法-活动选择问题C++实现
- 装配线调度问题 算法导论动态规划P194
- 0-1背包问题动态规划代码实现(C++实现)
- 动态规划之钢条切割(算法导论)
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 算法导论 第四部分——基本数据结构——第15章:动态规划:背包问题
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现