474 一和零 類似01揹包問題

2021-10-20 16:22:30 字數 1146 閱讀 7831

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的字串,現在要求從這個陣列中選出若干字串,使得這個字串的0的個數不超過m,1的個數不超過n,求可以選出的字串最多有多少個。

首先,統計出每乙個字串有多少的0和1分別放到a0[

]和a1

[]

a0和a1

a0和a

1[]陣列中去,這樣的話,這個0和1的個數就相當於揹包問題中的揹包的容量,這不過這裡有兩個容量,每乙個字串的價值為1,這樣我們就轉化成了揹包問題。

狀態轉移方程:

細節,雖然上面的狀態轉移方程寫的k

>=1

k>=1

k>=1

,但是迴圈的時候我們可以從0開始寫,考慮邊界條件,dp[

0][i

][j]

=0

dp[0][i][j]=0

dp[0][

i][j

]=0,i和j的迴圈需要覆蓋到範圍0−m

和0−n

0-m和0-n

0−m和0−

n,這樣的話也能表示m或者n為0的情況。

// 類似0,1揹包問題

class solution

}if(num==0)

return num_1;

}int findmaxform(vector& strs, int m, int n)

a0.resize(strs.size());

a1.resize(strs.size());

for(i=0;i=0;i--)}}

}printf("%d\n",dp[m][n]);

return dp[m][n];

}};

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

在計算機界中,我們總是追求用有限的資源獲取最大的收益。現在,假設你分別支配著 m 個 0 和 n 個 1。另外,還有乙個僅包含 0 和 1 字串的陣列。你的任務是使用給定的 m 個 0 和 n 個 1 找到能拼出存在於陣列中的字串的最大數量。每個 0 和 1 至多被使用一次。注意 給定 0 和 1 ...

474 一和零(動態規劃)

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

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...