Backpack III 完全背包

本文深入解析了完全背包问题,一种常见的动态规划问题。通过实例,详细介绍了如何利用动态规划求解最大价值,给出了清晰的算法思路及Python实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given n kind of items with size Ai and value Vi( each item has an infinite number available) and a backpack with size m. What's the maximum value can you put into the backpack?

Given 4 items with size [2, 3, 5, 7] and value [1, 5, 2, 4], and a backpack with size 10. The maximum value is 15.

完全背包问题,即每件物体可取任意件。dp[i,j]表示为前i个物体填满背包可获得的最大价值。DP方程转换为dp[i,j] = max(dp[i-1,j], dp[i, j - Ai] + Vi)。这样转换的复杂度为O(NV),要快于从0-1背包转化过来的从i-1上讨论的转化方程O(NV^2)。

注意这里与0-1背包不一样因为第i件物品可以添加多件.所以DP可以在已加入当前物体的状态下继续添加.

代码入下:

class Solution:
    # @param {int[]} A an integer array
    # @param {int[]} V an integer array
    # @param {int} m an integer
    # @return {int} an array
    def backPackIII(self, A, V, m):
        n = len(A)
        dp = [0] * (m + 1)
        for i in xrange(n):
            for j in xrange(A[i], m + 1):
                dp[j] = max(dp[j], dp[j - A[i]] + V[i])
        
        return dp[m]

 

转载于:https://www.cnblogs.com/sherylwang/p/5681585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值