#include
#include
#include
using namespace std;
int CutRod(int * p,int n,int * s,int * r)
{
if(n==0) return 0;
int q = -1e10;
int cutPosition = 0;
for(int i = 1;i <= n; i++)
{
int temp = p[i]+CutRod(p,n-i,s,r);
if(temp > q)
{
q = temp;
cutPosition = i;
}
}
s[n] = cutPosition;
r[n] = q;
return q;
}
int MemoizedCutRodAux(int * p,int n,int * s,int * r)
{
if(r[n]>=0)
return r[n];
int q;
if(n==0)
q = 0;
else
{
q = -1e10;
int temp;
int cutPosition;
for(int i=1;i<=n;i++)
{
temp = p[i]+MemoizedCutRodAux(p,n-i,s,r);
if(temp>q)
{
q = temp;
cutPosition = i;
}
}
s[n] = cutPosition;
r[n] = q;
}
return q;
}
void MemoizedCutRod(int * p,int n,int * s,int * r)
{
for(int i=0;i < n;i++)
r[i] = -1e10;
MemoizedCutRodAux(p,n,s,r);
}
void BottomUpCutRod(int * p,int n,int * s,int * r)
{
r[0] = 0;
for(int j=1;j<=n;j++)
{
int q = -1e10;
for(int i = 1;i <= j;i++)
{
if((p[i]+r[j-i])>q)
{
q = p[i]+r[j-i];
s[j] = i;
}
}
r[j] = q;
}
}
void CutRodProblem()
{
int p[11] = {0 , 1 , 5 , 8 , 9 , 10 , 17 , 17 , 20 , 24 , 30};
const int n = 4;
int s[n+1];
int r[n+1];
//直接递归求解
//CutRod(p,n,s,r);
//动态规划——自顶向下,带备忘方式
//MemoizedCutRod(p,n,s,r);
//动态规划——自底向上,逆拓扑排序求解
BottomUpCutRod(p,n,s,r);
cout<
int len = n;
while(len>0)
{
cout<
len = len-s[len];
}
cout<
}
int main()
{
clock_t start,finish;
start = clock();
CutRodProblem();
finish = clock();
double duration;
duration = (double)(finish- start)/CLOCKS_PER_SEC;
cout<
system("pause");
return 1;
}