01背包问题

题目:

代码: 

#读入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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值