https://leetcode.com/problems/ones-and-zeroes/description/
dp真实菜,,竟然没看出来o-1背包。。
然后写的时候 有个坑,就是 如果某个数,1的个数超过
int dp[105][105];
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
// sort(strs.begin(), strs.end(), cmp);
memset(dp, 0, sizeof(dp));
vector<int>one(strs.size(), 0);
vector<int> zero(strs.size(), 0);
// vector<int > val(strs.size(), 0);
for (int i = 0; i < strs.size(); i++) {
// int v = 0, o = 0, z = 0;
for (int j = 0; j < strs[i].size(); j++) {
// v = v * 2 + (int)(strs[i][j] - '0');
if (strs[i][j] == '0')
zero[i] ++;
else
one[i] ++;
}
// cout << "i:" << i << " zero:" << zero[i] << " one:" << one[i] << endl;
// val[i] = v;
}
int mx_v = 0, mx_cnt = 0, ret = 0;
for (int i = 0; i < strs.size(); i++) {
for (int j = n; j >= 0; j--) {
for (int k = m; k >= 0; k--) {
if (k >= zero[i] && j >= one[i]) {
dp[j][k] = i ? max(dp[j][k], dp[j-one[i]][k-zero[i]] + 1) : 1;
} else {
dp[j][k] = i ? dp[j][k] : 0;
}
// cout << "i:" << i << " j:"<< j << " k:" << k << " v:" << dp[i][j][k] << endl;
// ret = max(dp[i][j][k], ret);
}
}
}
return dp[n][m];
// return ret;
}
};