leetcode 474.一和零 (01背包 二维

该文章介绍了一种使用动态规划解决01背包问题的方法,其中涉及到了背包容量、字符串中0和1的计数。通过dp[i][j]矩阵记录在不同0和1数量限制下的最大字符串数量,利用递推公式更新状态,并以字符串的01计数进行倒序遍历,最终得出在给定背包容量下能容纳的最大字符串数量。
摘要由CSDN通过智能技术生成

。。想不到

这里涉及到三个变量: 0 的个数,1 的个数,背包中的数量

所以不能压缩成一维的 01背包

1. dp[ i ] [  j ] 的含义

        下标:i 表示 0 的数量,j 表示 1 的数量

        值:表示当前背包的放入字符串的最大数量

2.递推公式

         dp[i][j] = max(dp[i][j], dp[i - zeroNums][j - oneNums] + 1)

        不放入当前的字符串:dp[i][j]

        放入当前的字符串,且当前字符串中的 0 的数量为 zeroNums,1 的数量为 oneNums:

        dp[i - zeroNums][j - oneNums] + 1

        这个 + 1 就是表示背包中多了一个字符串

3.初始化

       dp[0][0] = 0 当前没有放入任何东西,其它的跟之前题一样,初始化成最小的非负整数

4. 遍历顺序

        物品正序

        背包倒序:因为也是要使用到之前的 dp[i - zeroNums][j - oneNums] 的状态

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        
        // 定义 + 初始化 
        vector<vector<int>> dp(m + 1, vector<int>( n + 1, 0));

        for(string str : strs)
        {
            int zeroNums = 0, oneNums = 0;
           // 计算每个字符串的 0 1 个数
            for(char c : str)
            {
                if(c == '0')
                    zeroNums++;
                else
                    oneNums++;
            }
            
            // 倒序遍历,但这里的双层循环遍历顺序没有讲究
            for(int i = m ; i >= zeroNums; i--)
            {
                for(int j = n ; j >= oneNums; j--)
                    dp[i][j] = max(dp[i][j], dp[i - zeroNums][j - oneNums] + 1);
            }
        }

        return dp[m][n];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值