0-1背包问题变体

90 阅读1分钟

一和零

给定一个二进制字符串数组str和两个整数m和n,
找出并返回strs的最大子集的大小,该子集中最多有m个0和n个1。
如果x的所有元素也是y的元素,集合x是集合y的子集。

思路

这是一道0-1背包的变体:
str数组中的元素是物品,每个物品只能使用一次;
m和n相当于一个背包,每个维度的背包。

代码实现
class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        int[][] dp = new int[m + 1][n + 1];
        // dp[i][j] 表示m = i,n = j 可装的最大子集数
        for (int i = 0; i < strs.length; i++) {
            String str = strs[i];
            int count0 = 0;
            int count1 = 0;
            char[] chars = str.toCharArray();
            for (char c :chars) {
                if (c == '0'){
                    count0 ++;
                }
                if (c == '1'){
                    count1 ++;
                }
            }
            for (int j = m; j >= count0 ; j--) {
                for (int k = n; k >= count1 ; k--) {
                    dp[j][k] = Math.max(dp[j][k],dp[j - count0][k - count1] + 1);
                }
            }
        }
        return dp[m][n];
    }
}