日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一和零(二维01背包)

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一和零(二维01背包) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給你一個二進制字符串數組 strs 和兩個整數 m 和 n 。
請你找出并返回 strs 的最大子集的大小,該子集中 最多 有 m 個 0 和 n 個 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1: 輸入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3
輸出:4
解釋:最多有 5 個 0 和 3 個 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4 。
其他滿足題意但較小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”} 。{“111001”} 不滿足題意,因為它含 4 個 1 ,大于 n 的值 3 。

示例 2: 輸入:strs = [“10”, “0”, “1”], m = 1, n = 1
輸出:2 解釋:最大的子集是 {“0”, “1”} ,所以答案是 2 。

提示:
1 <= strs.length <= 600
1 <= strs[i].length <= 100
strs[i] 僅由 ‘0’ 和 ‘1’ 組成
1 <= m, n <= 100

這道題同樣是01背包的問題,但是不好看出來,我們來分析一下:
每個字符串數組中的字符串都只會使用一次,所以符合01背包特點;
m 和 n 就類似于背包容量,但是這里卻是二維的;
strs就相當于物品
相對應的我們可以將每個字符串1和0的個數求出來,就相當于物品的重量
字符串的個數就相當于物品價值

接下來就可以分析解題步驟了
1,dp[i][j]是 i 個0和 j 個1的strs的最大子集大小
2,dp[i][j] 可以由前一個strs里的字符串推導出來,strs里的字符串有zeronums個0,onenums個1。
dp[i][j] 就可以是 dp[i - zeronums][j - onenums] + 1,取最大值后即
dp[i][j] = max(dp[i][j], dp[i - zeronums][j - onenums] + 1);
3,物品價值不會為負,所以初始化都為0即可
4,遍歷順序依舊是外面是物品正序遍歷,里面是背包大小逆序遍歷;

代碼如下:

class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (auto str : strs) {int zeronums = 0, onenums = 0;for (auto ch : str) {if (ch == '0') zeronums++;else onenums++;}for (int i = m; i >=zeronums; --i) {for(int j = n; j >= onenums; --j) {dp[i][j] = max(dp[i][j], dp[i - zeronums][j - onenums] + 1);}}}return dp[m][n];} };

總結

這道題關鍵是對二維背包的理解,了解01背包有這種形式。

總結

以上是生活随笔為你收集整理的一和零(二维01背包)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。