其他分享
首页 > 其他分享> > 二维背包问题

二维背包问题

作者:互联网

本质: 状态转移方程,即下一时刻状态受上一时刻状态的影响

步骤:

1、建立目标域 (即,多个背包的可能性组合)

2、判断当前时刻的状态值

 

例题:

输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
输出: 4
解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。

解题思路:

1. 可用0和1的个数可以看成不同容量的背包(二维)
dp[i][j]    i 表示可用0的个数, j 表示可用的1的个数


2. 对应每一个01串, 做的事情:
对于可以放得下的背包  ①不放,则查看当前背包容纳物品的数量   ②放,则 1(数量+1) + 剩余背包空间的能容纳物品的数量(该值受上一时刻的影响)


3. 状态转移方程:
dp[i][j] = max(dp[i][j],  1 + dp[ i-item_count0 ][ j-item_count1 ])

当前时刻背包容纳数量  =  (  未变化前背包容纳数量  , 变化后的背包容纳数量 )中的最大值

 

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        if len(strs) == 0:
            return 0
        
        dp = [[0]*(n+1) for _ in range(m+1)]   #建立 坐标域
        
        for strs_item in strs:
            item_count0 = strs_item.count('0')                #统计列表中个元素的‘0’‘1’数量
            item_count1 = strs_item.count('1')
            
            #遍历可容纳的背包 
            for i in range(m, item_count0 - 1, -1):  #采取倒序,由于后一时刻受前一时刻的影响
                for j in range(n, item_count1 - 1, -1):
                    dp[i][j] = max(dp[i][j], 1 + dp[i-item_count0][j-item_count1])
                    
        return dp[m][n] 

hi我是大嘴巴 发布了207 篇原创文章 · 获赞 42 · 访问量 7万+ 私信 关注

标签:背包,strs,问题,item,二维,count1,容纳,dp
来源: https://blog.csdn.net/weixin_38740463/article/details/104514368