钢条切割问题

来源:互联网 发布:mac reminders 编辑:程序博客网 时间:2024/06/10 21:35

动态规划的一般步骤:

1.刻画一个最优解的结构特征

2.递归定义最优解的值

3.计算最优解的值,通常采用自底向上的方法

4.利用计算出的信息构造一个最优解

利用动态规划方法求解类似钢条切割方案的这一类递归问题,可避免反复求解相同的子结构,下面是朴素递归算法和用动态规划设计的递归算法的相应实现。

//钢条切割问题#include "stdafx.h"#define N 11int p[N]={0,1,5,8,9,10,17,17,20,24,30};//朴素递归 O(2^n)int cut_rod(int n){if(n==0)return 0;int max=-1;for(int i=1;i<=n;++i){int tmp=p[i]+cut_rod(n-i);if(max<tmp){max=tmp;}}return max;}//动态规划,带备忘的自顶向下//辅助过程int memoized_cut_rod_AUX(int n,int* r);int memoized_cut_rod(int n){int *r=new int[n+1];for(int i=0;i<=n;++i){r[i]=-1;}int result=memoized_cut_rod_AUX(n,r);delete [] r;return result;}int memoized_cut_rod_AUX(int n,int* r){if(r[n]>=0)return r[n];if(0==n)return 0;int max=-1;for(int i=1;i<=n;++i){int tmp=p[i]+memoized_cut_rod_AUX(n-i,r);if(max<tmp){max=tmp;}}return max;}//自底向上int bottom_up_cut_rod(int n){int* r=new int[n+1];for(int i=0;i<=n;++i){r[i]=0;}for(int j=1;j<=n;++j){int max=-1;for(int k=1;k<=j;++k){int tmp=p[k]+r[j-k];if(max<tmp)max=tmp;}r[j]=max;}int result=r[n];delete [] r;return result;}int main(){int putin;while(1){cin>>putin;cout<<bottom_up_cut_rod(putin)<<endl;}}


0 0
原创粉丝点击