zoukankan      html  css  js  c++  java
  • 125. 背包问题 II

    125. 背包问题 II

    中文English

    有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.

    问最多能装入背包的总价值是多大?

    样例

    样例 1:

    输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]
    输出: 9
    解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9 
    

    样例 2:

    输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]
    输出: 10
    解释: 装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10
    

    挑战

    O(nm) 空间复杂度可以通过, 不过你可以尝试 O(m) 空间复杂度吗?

    注意事项

    1. A[i], V[i], n, m 均为整数
    2. 你不能将物品进行切分
    3. 你所挑选的要装入背包的物品的总大小不能超过 m
    4. 每个物品只能取一次
    输入测试数据 (每行一个参数)如何理解测试数据?

    10
    [2,3,5,7]
    [1,5,2,4]

    class Solution:
        '''
        大致思路:
        1. 转移方程
        dp[i][j] = dp[i - 1][j]
        dp[i][j] = max(dp[i][j], dp[i - 1][j - A[i - 1] + V[i - 1]]
        '''
        def backPackII(self,m,A,V):
            #初始条件
            max_value = 0
            l = len(A)
            dp = [[0]*(m + 1) for _  in range(l + 1)]
    
            #对于前0个物品,拼出m重量,是不可能的,价值也是0 
    
            #对于i个物品,拼接0重量,存在,价值为0
    
            #计算顺序
            for i in range(1, l + 1):
                for j in range(1, m + 1):
                    #当前前i个物品,要达到重量j的话,上一次已经达到了重量j,所以价值一样
                    dp[i][j] = dp[i - 1][j]
    
                    if (j - A[i - 1]) >= 0:
                        dp[i][j] = max(dp[i][j], dp[i - 1][j - A[i - 1]] + V[i - 1])
                        #dp[1][2] = max(dp[0][2], dp[0][2 - 2] + V[0]) >> 1
                        #dp[1][3] = max(dp[0][3], dp[0][3 - 2] + V[0]) >> 1
    
                        #dp[2][3] = max(dp[2][3], dp[1][3 - 3] + V[1]) >> 5
                        #dp[2][4] = max(dp[2][4], dp[1][4 - 3] + V[1]) >> 5
                        #dp[2][4] = max(dp[2][4], dp[1][5 - 3] + V[1]) >> 6
    
            return dp[l][m]
  • 相关阅读:
    【Linux】命令——基本命令
    正则表达式
    Letex
    Markdown
    文本编辑器Vim
    【Linux】集群
    【Linux】软件安装
    共线性synteny
    windows触控手势
    【Linux】bin结尾的安装包
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/13172452.html
Copyright © 2011-2022 走看看