2022.4.3期全服記錄榜
阿新 • • 發佈:2022-04-03
✅做題思路or感想
一道01揹包問題,有所不同的是這裡揹包的價值是“個數”
這裡每一個物品都有兩種重量,所以揹包也設有兩種容量就好了,二維揹包走起來
dp陣列的含義
-
dp[i][j]
表示容量為i
,j
的揹包所能容納的最大元素個數
遞推公式
- 經典01揹包公式的兩個容量版,以及把價值變成了個數:
dp[i][j] = max(dp[i][j], dp[i - count0][j - count1] + 1)
初始化
- 這一題並不需要特意的初始化,全部初始化為0就好了
遍歷順序
- 物品正序,揹包容量倒序(因為每一個物品只能被放入一次)
class Solution { public: int findMaxForm(vector<string>& strs, int m, int n) { vector<vector<int>>dp (m + 1, vector<int>(n + 1, 0)); for (int k = 0; k < strs.size(); k++) { //這裡需要額外把物品的重量算出來 int count0 = 0, count1 = 0; for (int l = 0; l < strs[k].size(); l++) { if (strs[k][l] == '0')count0++; else count1++; } for (int i = m; i >= count0; i--) { for (int j = n; j >= count1; j--) { dp[i][j] = max(dp[i][j], dp[i - count0][j - count1] + 1); } } } return dp[m][n]; } };