本题依然是 01 背包问题,不过背包有两个维度(m 和 n),是一个二维 01 背包。故 dp 数组要开二维、需要三重循环得出结果。
class Solution { public: int findMaxForm(vector<string>& strs, int m, int n) { vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // dp[i][j]:最多有i个0和j个1的strs的最大子集长度为dp[i][j] for(string str: strs) { // 遍历strs数组,相当于遍历物品 int zeroNum = 0; int oneNum = 0; for(char c: str) { if(c == '0') zeroNum ++; else oneNum ++; } // 遍历背包,两个维度就需要二重循环 for(int i = m; i >= zeroNum; i --) { for(int j = n; j >= oneNum; j --) { dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1); // 放当前物品和不放当前物品的长度取最大值 } } } return dp[m][n]; } };