中国开发网: 论坛: 程序员情感CBD: 贴子 486550
wzydf: 看到某个人用python写的实现,但我不是很理解
我的解法如下,时间复杂度是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()

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录