1 #include"stdafx.h"
2 #include<iostream>
3 using namespace std;
4 /*
5 动态规划算法:
6 1.刻画一个最优解的结构特征
7 2.递归地定义最优解的值
8 3.计算最优解的值,通常采用自底向上的方法
9 4.利用计算出的信息构造一个最优解.
10 */
11 /*普通递归法*/
12 int CutRod(int *p ,int n)
13 {
14 if(n==0)
15 return 0;
16 int q=0;
17 for(int i = 1;i<=n;++i)
18 {
19 q=max(q,p[i]+CutRod(p,n-i));
20 }
21 return q;
22 }
23
24 /*加入了备忘录机制*/
25 int CutRodMemoized(int *p ,int *r,int n);
26 int memory(int *p ,int n)
27 {
28 int *r = new int[n];
29 for(int i =0 ;i!=n;i++)
30 {
31 r[i]=-1;
32 }
33 return CutRodMemoized(p,r,n);
34 }
35 int CutRodMemoized(int *p ,int *r,int n)
36 {
37 if(r[n]>=0)
38 return r[n];
39 int q = -1;
40 if(n==0)
41 q = 0;
42 else{
43 q=-1;
44 for(int i = 1;i<=n;++i)
45 q=max(q,p[i]+CutRodMemoized(p,r,n-i));
46 }
47 r[n]=q;
48 return q;
49 }
50
51 /*自底向上版本*/
52 int BottomUp(int *p,int n)
53 {
54 int *r = new int[n];
55 r[0]=0;
56 for(int j = 1;j<=n;j++)
57 {
58 int q = -1;
59 for(int i = 1;i<=j;i++){
60 q = max(q,p[i] +r[j-i]);
61 }
62 r[j]=q;
63 }
64 return r[n];
65 }
66
67 /*自底向上版本扩展,记录切割点,也就是实现第四步,构造出最优解*/
68 int BottomUpExtent(int *p,int n,int *r,int *s);
69 void BottomExtent(int *p,int n)
70 {
71 int *r = new int[n];
72 int *s = new int[n];
73 cout<<"最大收益"<<BottomUpExtent(p,n,r,s)<<endl;
74 cout<<"切割方式为:"<<endl;
75 while(n>0){
76 cout<<s[n]<<" ";
77 n = n-s[n];
78 }
79 }
80 int BottomUpExtent(int *p,int n,int *r,int *s)
81 {
82
83 r[0]=0;
84 s[0]=0;
85 for(int j = 1;j<=n;j++)
86 {
87 int q = -1;
88 for(int i = 1;i<=j;i++){
89 if(q<p[i]+r[j-i])
90 {
91 q = p[i] +r[j-i];
92 s[j] = i;
93 }
94
95
96 }
97 r[j]=q;
98 }
99 return r[n];
100 }
101
102 int _tmain(int argc, _TCHAR* argv[])
103 {
104 int q[11]={0,1,5,8,9,10,17,17,20,24,30};
105 cout<<CutRod(q,8)<<endl;
106 cout<<memory(q,8)<<endl;
107 cout<<BottomUp(q,8)<<endl;
108 BottomExtent(q,8);
109 }