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