动态规划之背包问题

现在有3个物品,背包容量为10,欲求在有限的容量内装入的物品价值最大。

 采用动态规划,当前物品取或不取分两种情况取最值,完成下表的填写:

维护动态数组dp[i][j]表示当前可以取前i个物品,在j的容量下可装入物品的最大价值量。

边界条件是只取第一个物品时的状态dp[0][j]。当背包容量j=0时,dp[i][0]=0。代码如下:

# -*- coding:utf-8 -*-
#背包问题
num=3#可装入物品的数量
money=10#背包最大容量(体积)
vol=[3,4,5]#num个物品各自的体积
val=[4,5,6]#num个物品各自的价值
def dp(money,vol,val):
    res=[[0 for _ in range(money+1)] for _ in range(len(vol))]#初始化dp数组
    for i in range(1,money+1):#边界条件
        if i<vol[0]:
            res[0][i]=0
        else:
            res[0][i]=val[0]
    for i in range(1,len(vol)):#动态规划状态转移
        for j in range(1,money+1):
            res[i][j]=max(res[i-1][j],res[i-1][j-vol[i] if j>=vol[i] else 0]+val[i] if j>=vol[i] else 0  )
    return res
print(dp(money,vol,val) )
    

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值