01背包问题

  • Post author:
  • Post category:其他


题目:

代码:

#读入n件物品、总容量v
n , v = list(map(int,input().split()))
wei = []
val = []
#创建两个列表,存放物品的体积和价值
for i in range(n):
    wi , vi = map(int,input().split())
    val.append(vi)
    wei.append(wi)
    
dp = [[0]*(v+1) for i in range(n+1)] #令初始值均为零

for i in range(1,n+1):
    for w in range(1,v+1):
        dp[i][w] = dp[i-1][w] #第i个物体不选时,dp值与第i-1次的dp值相同
        if w - wei[i-1] >= 0: #容量有剩余时
            #取不选时与选时的价值的最大值
            dp[i][w] = max(dp[i][w],dp[i-1][w-wei[i-1]]+val[i-1]) 
print(dp[n][v])

dp = [[0]*(v+1) for i in range(n+1)]解析:


列表推导式

:由一个表达式以及紧跟着这个表达式的for语句构成,for语句还可以跟0个或多个if或for语句。

list1 = [1,2,3]
list2 = [3,2,1]
[x * y for x in list1 for y in list2]

它的意思是:x从list1中取,y从list2中取,最终输出x*y


dp = [[0]*(v+1) for i in range(n+1)]

这个列表生成式表示的是一个二维数组,第一维的长度是n+1即行数,第二维的长度是v+1即列数。相当于(N+1)*(V+1)的二维数组dp[0][…]=dp[…][0]=0。



版权声明:本文为weixin_53148422原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。