#include<cstdio>
#define MAXN 1010
#define INF 999999999
int p[MAXN], r[MAXN], s[MAXN];//p[i]---长度为i的价格;r[i]---长度为i的最大收益;s[i]---长度为i的最大收益方案中,第一段切下的长度;
int solve(int n)
{
if(n == 0)
return 0;
r[0] = 0;
int q;
for(int i = 1; i <= n; i++)//规模从1-n增加
{
q = -INF;
for(int j = 1; j <= i; j++)//对规模为i的情况进行各种情况的尝试
{
if(q < p[j]+r[i-j])
{
q = p[j] + r[i-j];
s[i] = j;
}
}
r[i] = q;
}
return r[n];
}
void print(int n)
{
while(n > 0)
{
printf("%d ", s[n]);
n -= s[n];
}
}
int main()
{
int n;
while(~scanf("%d", &n))//读入钢条的长度;
{
for(int i = 1; i <= n; i++)
scanf("%d", &p[i]);//读入价格表;
int res = solve(n);
printf("%d\n", res);//输出最大收益;
print(n);//输出最优切割方案;
}
}
动态规划解决钢条切割问题
最新推荐文章于 2019-03-29 15:54:22 发布