美文网首页
完全背包问题

完全背包问题

作者: 小碧小琳 | 来源:发表于2018-10-14 22:35 被阅读0次

相比于01背包问题
只是单纯的多了一个条件:物品可以重复利用。

这是01背包问题的状态转移方程:

  • 当W-wi大于0时,F(n,w) = max(F(n-1,W-wi)+vi,F(n-1,w))
  • 当W-wi小于0时,F(n,w) = F(n-1,w))

我们只关注第一个方程,对于完全背包问题,当我们用了第n个物品以后,因为n还可以再次被用,因此其中一个最优子结构F(n-1,W-wi)+vi应该变为F(n,W-wi)+vi,代表用来第n个物品以后,还可以用第n个物品。

对应到代码上,F(n-1,W-wi)代表的是对应的是第 n-1 行的物品中的第W-wi个重量的最大值。对应到代码中就是res_pre中的index为W-wi的值。而F(n,W-wi)对应的就是第n行的物品,就应该是res中的index为W-wi的值
,因此,在01背包问题的代码的基础上,只需要把状态转移方程中的res_pre[w - w_list[n]] + v_list[n]改为res[w - w_list[n]] + v_list[n]即可。

代码实现:

N = 4
W = 10
# v_list = [10,40,30,50]
# w_list = [5,4,6,3]
v_list = [1,5,2,4]
w_list = [2,3,5,7]

#用 一维数组保存中间数据。初始化当只有1个物品的时候,最开始的一维数组。
res_pre = [0]
#注意这里为了与列表中物品的重量一致,需要从1到w+1开始循环
for i in range(1,W+1):
    if i < w_list[0]:
        res_pre.append(0)
    else:
        res_pre.append(v_list[0])

#开始滚动更新一维数组
for n in range(1,N):
    res = [0]
    for w in range(1,W+1):
        if w - w_list[n] < 0:
            res.append(res_pre[w])
        else:
            res.append(max(res[w - w_list[n]] + v_list[n],res_pre[w]))
    # 将新的一行,赋值给res_pre
    res_pre = res
print(res_pre[-1])

相关文章

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • 完全背包问题

    相比于01背包问题只是单纯的多了一个条件:物品可以重复利用。 这是01背包问题的状态转移方程: 当W-wi大于0时...

  • 完全背包问题

    有n个重量和价值分别为wi,vi的物品。从这些物体中挑选出总重量不超过W的物品,求所有方案中价值总和的最大值。在这...

  • 完全背包问题

    https://www.cnblogs.com/A1269180380/p/6344043.html 注意数组的遍...

  • 背包问题2(完全背包)

    01背包是指每件物品有且只有一件,而完全背包则是每件物品件数无限,求装入背包所对应的最值。完全背包也有公式,在01...

  • 动态规划完全背包01

    完全背包 和01背包一样力扣上没有没有纯完全背包问题,都是需要完全背包的各种应⽤,需要转化成完全背包问题,所以我们...

  • 背包系列问题之--完全背包问题

    问题描述 小偷深夜潜入一家珠宝店,店里有5类宝物,每类宝物体积分别为W{1,3,2,4,5},对应的价值为V{20...

  • 算法-动态规划算法总结

    1 基础问题 2 背包问题 2.1 01背包 2.2 完全背包 3 打劫问题 4 股票问题 5 子序列问题 5.1...

  • 01背包问题(完全背包,部分背包)golang实现

    很经典的动态规划问题,具体思路这里就不列出了,网上太多资料了。想要详细理解的话可以去看背包九讲这里分别列出,01背...

  • 动态规划常见面试题

    子序列类型编辑距离 最长递增子序列 最大子数组 最长公共子序列 背包问题0-1背包问题 子集背包问题 完全背包问题...

网友评论

      本文标题:完全背包问题

      本文链接:https://www.haomeiwen.com/subject/diztzftx.html