# 1.从左往右尝试模型（背包问题）

2021-11-03 10:01:02  阅读：82  来源： 互联网

1.背包问题

2.474.一和零

• 1 <= strs.length <= 600
• 1 <= strs[i].length <= 100
• strs[i] 仅由 '0' 和 '1' 组成
• 1 <= m, n <= 100
```class Solution {
int size=0;
public int findMaxForm(String[] strs, int m, int n) {
//  return process(strs,m,n,0,0,0);
return process2dp(strs,m,n);
}
// 01 001 100. index sum_1<=m sum_0<=n

private int process(String[] strs,int m,int n,int index,int sum_1,int sum_0){
if(index==strs.length){
return 0;
}

if(sum_0>m && sum_1>n){
return 0;
}

int p1= process(strs,m,n,index+1,sum_1,sum_0);
String s= strs[index];
int sum1=0;
int sum0=0;
for(char c:s.toCharArray()){
if(c=='0'){
sum0++;
}
if(c=='1'){
sum1++;
}

}
int p2=Integer.MIN_VALUE;
if(sum0+sum_0<=m && sum1+sum_1<=n){
p2= process(strs,m,n,index+1,sum_1+sum1,sum_0+sum0) + 1;
}
return Math.max(p1,p2);
}

private int process2dp(String[] strs,int m,int n){
//index 0---strs.length().  sum0. 0---m sum1 0---n
int N=strs.length;
int[][][] dp=new int[N+1][m+1][n+1];
for(int i=N-1;i>=0;i--){
for(int j=0;j<=m;j++){
for(int k=0;k<=n;k++){
int p1=dp[i+1][j][k];
String s= strs[i];
int sum1=0;
int sum0=0;
for(char c:s.toCharArray()){
if(c=='0'){
sum0++;
}
if(c=='1'){
sum1++;
}

}
int p2=Integer.MIN_VALUE;
if(sum0+j<=m && sum1+k<=n){
p2= dp[i+1][sum0+j][sum1+k]+1;
}

dp[i][j][k]=Math.max(p1,p2);
}
}
}

return dp[0][0][0];
}
}
```