wzydf:
				看到某个人用python写的实现,但我不是很理解
 
			[阅读: 369] 2007-03-20 02:57:02
			
				我的解法如下,时间复杂度是O(MAX_OVERLOAD*MAX_LENGTH),相当典型的动态规划解法
#coding: cp936
MAX_OVERLOAD 	= 50			# 最大载重
TOTAL_COUNT 	= 100			# 香蕉总数
MAX_LENGTH 		= 50			# 路的总长度
def main():
	# count[i]表示第i米还有多少根香蕉
	count = [0] * (MAX_LENGTH + 1)
	count[0] = TOTAL_COUNT
	# pre[i]表示,第i米香蕉最多的方案的上一步是哪里
	pre = [-1] * (MAX_LENGTH + 1)
	# 考查每一米可能的最大值
	for i in xrange(1, MAX_LENGTH+1):
		# 对所有可能的上一步进行考查,看是否可能得到最大值
		for j in xrange(max(0, i-MAX_OVERLOAD+1), i):
			if count[j] == 0:
				continue
			# 得到把香蕉从第j米运到第i米后的余量
			currentcount = count[j] - (i - j) - 2 * (((count[j] + MAX_OVERLOAD
- 1) / MAX_OVERLOAD) - 1) * (i - j)
			if currentcount > count[i]:
				count[i] = currentcount		# 当前的最大值
				pre[i] = j					# 得到这个最大值的上一步的位置
	print '最多还剩 %s 根' % count[MAX_LENGTH]
	# 求出走过的路径,以及沿路的余量
	cur = MAX_LENGTH
	path = []
	left = []
	while cur >= 0:
		path.append(cur)
		left.append(count[cur])
		cur = pre[cur]
	path.reverse()
	left.reverse()
	print "走过的路径为:", ' --> '.join(["%4d" % (i) for i in path])
	print "沿路的余量为:", ' --> '.join(["%4d" % (i) for i in left])
main()