【发布时间】:2016-07-22 09:14:21
【问题描述】:
问题陈述
截杆问题如下。给定长度为n 英寸的杆和i = 1, 2, 3,....n 的价格表Pi,确定通过切割杆并出售碎片可获得的最大收入Rn。请注意,如果长度为n 的杆的价格Pn 足够大,则最佳解决方案可能根本不需要切割。
考虑n=4的情况。图中显示了切割 4 英寸长杆的所有方法,包括完全不切割的方法。我们看到,将一根 4 英寸的棒切成两根 2 英寸的小块会产生收入P2+P2=5+5=10,这是最优的。
下面的代码是一种自下而上的方法来构建切割棒的解决方案。
for (i = 1; i<=n; i++)
{
int q = INT_MIN;
for (j = 0; j < i; j++)
q= max(q, p[j] + r[i-j-1]);
r[i] = q;
}
return val[n];
为什么我们需要一个辅助数组r[n+1]?难道仅仅使用数组p就不能解决问题吗?使用它是因为我们在切割杆长度 n 和 0 时无法访问 p[-1] 吗?
为什么我们在 p 没有更新为新值时使用q = max(q, p[j] + r[i-j-1])?
【问题讨论】:
-
请附上切杆问题的定义以避免误解。
-
添加了一个例子。
-
内循环中的
-1让我有点困惑。 -
据我了解,
p是输入的一部分,不能被覆盖;内部循环的每次迭代都需要原始数据。 -
return val[n];没有任何意义——n只是杆的长度,val没有在其他任何地方提及。
标签: algorithm dynamic-programming