给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
这个题也是选还是不选的问题,只不过有三个状态,所以需要三维数组来用j和k表示m和n的状态,dp[i][j][k]表示在0到i的数组中,0的个数最大为j,1的个数最大为k的最大子集大小 然后dp表示的就是个数,个数越大就越大.
dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-n[0]][k-n[1]]) 就是n[0]是此时字符串的0的个数,n[1]是此时字符串的1的个数,
class Solution {
public boolean canPartition(int[] nums){
if(nums.length==0)return false;
int cols=0;
for(int i=0;i<nums.length;i++){
cols+=nums[i];
}
if((cols&1)==1)return false;
cols=cols/2;
boolean[][] dp=new boolean[nums.length][cols+1];
for(int i=0;i<cols+1;i++){
dp[0][i]=nums[0]==i?true:false;
}
for(int i=1;i<nums.length;i++){
for(int j=0;j<cols+1;j++){
dp[i][j]=dp[i-1][j];
if(j-nums[i]>=0){
dp[i][j]=dp[i][j] || dp[i-1][j-nums[i]];
}
}
}
return dp[nums.length-1][cols];
}
}