[M背包] lc474. 一和零(二维费用背包+好题)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[M背包] lc474. 一和零(二维费用背包+好题)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:474. 一和零
2. 题目解析
二维费用背包的应用。
本题终究还是一个选不选问题,那么这种有限制的选择问题,说了无数遍了,它就是一个背包问题。
将每个字符串都看作物品,其中 0 的个数就是重量,1 的个数就是体积,价值就是 1 。重量限制、体积限制就是 m
、n
。
二维费用背包同 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. 一和零(二维费用背包+好题)的主要内容,如果未能解决你的问题,请参考以下文章