ほとんどの文字列を構成します
Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
Output: 4
Explanation: There are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are "10","0001"
件名の説明:
できるだけ多くの文字列の集合から、選択した文字列は、0の数と与えられた値を超えないことを確実にします。
アイデアの分析:
0-1ナップザック問題の総重量を制限しながらタイトル0-1ナップザック問題と同様に、ここでの違いは、0と1の数を制限することです。ここで使用dpの数が0 J以下である前に、[I] [J] [k]はi番目の文字列を示し、数は文字列とき、kの選択数までの1以下です。統計0のi番目の列の数と1のi番目の列を取った場合、0と1であり、DP [I] [J] [k]はDPを= [I-1]〜[J-ZERO] [K-1] +1、i番目の文字列が取られていない場合、DP [I] [J] [k]はDPを= [I-1]とのいずれか大きい方[j] [k]は、 DP [I] [J] [k]の値を、DP [I] [J] [K]のみとDPために[I-1] [*] [*]であり、従ってプロセスの実現は、空間圧縮であってもよいですDP [j] [k]のように、唯一の前後からトラバースするときに横断することができます。
コード:
public int findMaxForm(String[]strs,int m,int n){//多维0-1背包,有两个背包大小,0的数量和1的数量。
if(strs==null||strs.length==0)
return 0;
int [][]dp=new int[m+1][n+1];
for(String str:strs){
int one=0;
int zero=0;
for(char c:str.toCharArray()){
if(c=='0')
zero++;
else
one++;
}
for(int i=m;i>=zero;i--){
for(int j=n;j>=one;j--){
dp[i][j]=Math.max(dp[i][j],dp[i-zero][j-one]+1);
}
}
}
return dp[m][n];
}