钢条分割 动态规划java_经典算法研究-动态规划-切割钢条问题 | 学步园

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值