ほとんどの構成動的計画法(0-1ナップザック)---文字列

ほとんどの文字列を構成します

474 1と0(媒体)

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];
}

おすすめ

転載: www.cnblogs.com/yjxyy/p/11120700.html