一、题目
二、代码
class Solution
{
public int findMaxForm(String[] strs, int m, int n)
{
//二维下标 代表1和0 m和n
int i,j,k;
int[][] dp = new int[m+1][n+1];
int length;
length = strs.length;
for(i=0;i<length;i++)
{
int one_num = 0;
int zero_num = 0;
for(char c: strs[i].toCharArray())
{
if(c=='0')
{
zero_num++;
}
else
{
one_num++;
}
}
// System.out.println(" one_num "+one_num);
// System.out.println(" zero_num "+zero_num);
// System.out.println(" ");
// System.out.println(" ");
//每一个装都要有一个二维遍历 这里二维等于原来的一维
for(j=m;j>=zero_num;j--)
{
for(k=n;k>=one_num;k--)
{
dp[j][k] = Math.max(dp[j][k] , dp[j-zero_num][k-one_num] +1 );
}
}
}
// System.out.println(" dp[m][n] "+dp[m][n]);
return dp[m][n];
}
}
三、运行结果
四、附录
二刷
class Solution
{
//最大子集 无过多技巧 就是逐个装入取大
public int findMaxForm(String[] strs, int m, int n)
{
int i,j,k;
int length = strs.length;
//System.out.println(" length "+length);
int[][] res = new int[m+1][n+1];
for(i=0;i<length;i++)
{
int zero = 0;
int one = 0;
int s_length = strs[i].length();
for(j=0;j<s_length;j++)
{
if(strs[i].charAt(j)== '0') zero++;
else one++;
}
// System.out.println(" 分割 ");
// System.out.println(" zero "+zero);
// System.out.println(" one "+one);
for(j=m;j>=zero;j--)
{
for(k=n;k>=one;k--)
{
res[j][k] = Math.max(res[j][k],res[j-zero][k-one]+1);
}
}
}
return res[m][n];
}
}