มี m ตัว 0 และ n ตัว 1 ให้อาร์เรย์สตริงไบนารี หาจำนวนสตริงสูงสุดที่สร้างได้ (แต่ละ 0 และ 1 ใช้ได้สูงสุด 1 ครั้ง)
ตัวอย่าง: ["10","0001","111001","1","0"], m=5, n=3 → 4 สตริง ("10","0001","1","0")
วิธีแก้ปัญหา (0/1 Knapsack 2D DP)
- DP table dp[m+1][n+1] = จำนวนสตริงสูงสุด
- วนทุกสตริง str:
- นับ one, zero ใน str
- วน j = m ถึง zero, k = n ถึง one (ย้อนกลับเพื่อ 0/1 knapsack):
- dp[j][k] = max(dp[j][k], 1 + dp[j-zero][k-one])
- อัปเดต ret = max(ret, dp[j][k])
- คืนค่า ret
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m + 1, vector<int>(n + 1));
int ret = 0;
for (int i = 0; i < strs.size(); i++) {
int one = 0, zero = 0;
for (char c : strs[i]) {
one += (c == '1');
zero += (c == '0');
}
for (int j = m; j >= zero; j--) {
for (int k = n; k >= one; k--) {
dp[j][k] = max(dp[j][k], 1 + dp[j - zero][k - one]);
ret = max(ret, dp[j][k]);
}
}
}
return ret;
}
};
int main() {
vector<string> v = {"10","0001","111001","1","0"};
Solution ob;
cout << ob.findMaxForm(v, 5, 3);
return 0;
}
Input
["10","0001","111001","1","0"] 5 3
Output
4