1. 程式人生 > 遊戲資訊 >2022.4.3期全服記錄榜

2022.4.3期全服記錄榜

✅做題思路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];
    }
};