https://leetcode-cn.com/problems/ones-and-zeroes/
思路:太久没写背包了,都有点忘了……把每个字符串的0、1个数抽象为代价,m、n抽象为背包容量上限,显然就是二维01背包问题,做法和一维背包类似。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
using pr=pair<int,int>;
vector<pr> vec;
for(const string& str:strs)
{
int ct=0;
for(const char& ch:str)
if(ch=='0')
++ct;
vec.emplace_back(ct,str.size()-ct);
}
vector<vector<int>> dp(m+1,vector<int>(n+1));
for(const pr& p:vec)
{
for(int i=m;i>=p.first;i--)
for(int j=n;j>=p.second;j--)
dp[i][j]=max(dp[i][j],dp[i-p.first][j-p.second]+1);
}
return dp[m][n];
}
};