玩轉lee474 一和零 0 1揹包問題

2021-10-03 02:09:48 字數 1276 閱讀 6446

在計算機界中,我們總是追求用有限的資源獲取最大的收益。

現在,假設你分別支配著 m 個 0 和 n 個 1。另外,還有乙個僅包含 0 和 1 字串的陣列。

你的任務是使用給定的 m 個 0 和 n 個 1 ,找到能拼出存在於陣列中的字串的最大數量。每個 0 和 1 至多被使用一次。

注意:給定 0 和 1 的數量都不會超過 100。

給定字串陣列的長度不會超過 600。

示例 1:

輸入: array = , m = 5, n = 3

輸出: 4

解釋: 總共 4 個字串可以通過 5 個 0 和 3 個 1 拼出,即 「10」,「0001」,「1」,「0」 。

示例 2:

輸入: array = , m = 1, n = 1

輸出: 2

解釋: 你可以拼出 「10」,但之後就沒有剩餘數字了。更好的選擇是拼出 「0」 和 「1」 。

思路:把總共的 0 個 1 的個數視為揹包的容量,每乙個字串視為裝進揹包的物品。這道題就可以使用 0-1 揹包問題的思路完成。這裡的目標值是能放進揹包的字串的數量。

思路依然是「乙個乙個嘗試,容量一點一點嘗試」,每個物品分類討論:選與不選。

第 1 步:定義狀態

dp[i][j][k] 表示子區間 [0, i] 能夠使用 j 個 0 和 k 個 1 的字串的最大數量。

第 2 步:狀態轉移方程

dp[i][j][k]= \begin dp[i - 1][j][k], & 不選擇當前考慮的字串,至少是這個數值\ dp[i - 1][j - 當前字串使用 0 的個數][k - 當前字串使用 1 的個數]& 選擇當前考慮的字串 \end

dp[i][j][k]=}}

}return dp[len]

[m][n];}

public

int[

]zeroandone

(string str)

return cnt;

}}

class

solution}}

return dp[m]

[n];

}public

int[

]zeroandone

(string str)

return res;

}}

public

int[

]zeroandone

(string str)

return res;

}

注意格式

474 一和零 類似01揹包問題

01揹包問題,有n件物品,放入容量為v的揹包內,每件物品的體積為a i a i a i 價值為v i v i v i 求揹包內可裝成的最大的價值。狀態設定為dp i j dp i j dp i j 代表前i件物品放入容量為j的揹包內,我們可以得到的最大的價值,很容易可以得到狀態轉移方程,這個網上的題...

01揹包問題之LeetCode474一和零詳解

題目 有n件物品和一個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。基本思路 01揹包的特點有兩個 乙個是每件物品有且只有乙個,二是每個物品可以選擇放或者不放。一般狀態轉移方程定義為 dp i j max dp i 1 j dp i 1 j w i v...

474 一和零(動態規劃)

474.一和零 author wsq date 2020 10 11 計算機界中,我們總是追求用有限的資源獲取最大的收益。現在,假設你分別支配著 m 個 0 和 n 個 1。另外,還有乙個僅包含 0 和 1 字串的陣列。你的任務是使用給定的 m 個 0 和 n 個 1 找到能拼出存在於陣列中的字串的...