微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

跟踪动态规划中的项目类似于背包问题

如何解决跟踪动态规划中的项目类似于背包问题

您好,我正在尝试解决这个 dp 问题:https://vjudge.net/problem/UVA-990

我可以使用下面的代码解决最初的问题结果:

我使用递归和备忘录表 arr 来优化代码

s=list(map(int,input().split()))
t=s[0] #seconds allowed under water
w=s[1] #w 
n=int(input()) #number of treasures
depth=[-1] 
gold=[-1]
time=[-1]
for i in range(3):
    q=list(map(int,input().split()))
    depth.append(q[0])
    gold.append(q[1])
    time.append(q[0]*w*3)

arr = [[-1]*(t+1) for i in range(0,(n+1))]

def maxGold(n,T):
    if n==0 or T==0:
        return 0
    if arr[n][T]!=-1:
        return arr[n][T]
    if time[n]>T:
        answer=maxGold(n-1,T)
    else:
        answer=max(maxGold(n-1,T),gold[n]+maxGold(n-1,T-time[n]))
    arr[n][T]=answer
    return answer

result=maxGold(n,t)
print(result)

但是我不知道如何跟踪所选项目。 例如,我想存储 maxGold() 输出的所选宝藏的所有索引,然后在循环中打印它们。

我采用的一种方法是向 maxGold() 函数添加一个参数,并将索引附加到它上面,然后从函数返回两个结果和索引列表,如下所示:

def maxGold(n,T,l):
    if n==0 or T==0:
        return 0,l
    if arr[n][T]!=-1:
        return arr[n][T],l
    if time[n]>T:
        answer=maxGold(n-1,l)
    else:
        l2=l[:]
        l2.append(n)
        answer=max(maxGold(n-1,l)[0],T-time[n],l2)[0])
    arr[n][T]=answer
    return answer,l

result=maxGold(n,t,[])
print(result[0])
list_of_indices=result[1]
length=len(list_of_indices)

#proceed outputs

然而,我遇到了许多元组/整数类型、可下标、可迭代的错误。即使在由于多个输出而尝试获取元组输出之后,也可以从该特定行开始:

answer=max(maxGold(n-1,l2)[0])

老实说,我不确定这种方法是否正确。

有什么提示吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。