[M背包] lc474. 一和零(二维费用背包+好题)

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M背包] lc474. 一和零(二维费用背包+好题)相关的知识,希望对你有一定的参考价值。

1. 题目来源

链接:474. 一和零

相关:[背包] 背包问题算法模板(模板)

2. 题目解析

二维费用背包的应用。

本题终究还是一个选不选问题,那么这种有限制的选择问题,说了无数遍了,它就是一个背包问题。

将每个字符串都看作物品,其中 0 的个数就是重量,1 的个数就是体积,价值就是 1 。重量限制、体积限制就是 mn

二维费用背包同 01 背包优化掉第一维一样,同时体积、重量都需要从大到小进行枚举。


时间复杂度: O ( n 2 m ) O(n^2m) O(n2m)

空间复杂度: O ( n m ) O(nm) O(nm)


class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> f(m + 1, vector<int>(n + 1));
        for (auto &s : strs) {
            int zero = 0, one = 0;
            for (auto &c : s) {
                if (c == '0') zero ++ ;
                else one ++ ;
            }

            // f[i][j][k] 选前i个物品,重量不超过j,体积不超过k 的最大价值
            // 运用 01 背包优化掉 i 这一维,体积重量均从大到小枚举 
            for (int i = m; i >= zero; i -- ) 
                for (int j = n; j >= one; j -- ) {
                    f[i][j] = max(f[i][j], f[i - zero][j - one] + 1);
                }
        }

        return f[m][n];
    }
};

以上是关于[M背包] lc474. 一和零(二维费用背包+好题)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 474. 一和零(01背包问题)

[474]. 一和零

[474]. 一和零

leetcode 474. 一和零

leetcode 474. Ones and Zeroes 一和零(中等)

leetcode No474. 一和零 java