力扣:474. 一和零

 动态规划的思路:

1.把int【】【】【】数组压缩成int【】【】的滚动数组来进行解题,int【】【】代表的是在i个0和j个1中的最大子集的长度为多少,其中i和j表示的是背包的容量

2.同时计数出数组中的全部的0和1的个数。

3.倒序遍历dp数组,使每一个物品只能使用一次,递推公式为:在使用物品i和不使用物品i中选择最大的值。

class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        //定义一个二维数组表示i个0和j个1时的最大子集的长度
        int[][] dp = new int[m + 1][n + 1];
        //计数元素中0和1的个数
        int oneNum, zeroNum;
        for (String str : strs) {
            oneNum = 0;
            zeroNum = 0;
            for (char ch : str.toCharArray()) {
                if (ch == '0') {
                    zeroNum++;
                } else {
                    oneNum++;
                }
            }
            //倒序遍历,使各个物品只能用一次
            for (int i = m; i >= zeroNum; i--) {
                for (int j = n; j >= oneNum; j--) {
        dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
                }
            }
        }
        return dp[m][n];
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>