分析

背包问题,但是这里的target有两个,所以最开始的是三维,降为二维的情况下,原本的二三维都需要逆序

代码

class Solution {
    /*public int findMaxForm(String[] strs, int m, int n) {

        int[][][] dp=new int[strs.length+1][m+1][n+1];
        dp[0][0][0]=0;
        for(int q=0;q<strs.length;q++)
        {
            int[] count=count0And1(strs[q]);
            for(int i=0;i<=m;i++)
                for(int j=0;j<=n;j++)
                {
                    dp[q+1][i][j]=dp[q][i][j];
                    if(i>=count[0]&&j>=count[1])
                    {
                        dp[q+1][i][j]=Math.max(dp[q+1][i][j],dp[q][i-count[0]][j-count[1]]+1);
                    }
                }
        }
        return dp[strs.length][m][n];
    }
    public int[] count0And1(String str)
    {
        int[] res=new int[2];
        for(int i=0;i<str.length();i++)
        {
            if(str.charAt(i)=='0')
                res[0]++;
            else res[1]++;
        }
        return res;
    }*/
    public int findMaxForm(String[] strs, int m, int n) {

        int[][] dp=new int[m+1][n+1];
        dp[0][0]=0;
        for(String str:strs)
        {
            int[] count=count0And1(str);
            for(int i=m;i>=0;i--)
                for(int j=n;j>=0;j--)
                {
                    dp[i][j]=dp[i][j];
                    if(i>=count[0]&&j>=count[1])
                    {
                        dp[i][j]=Math.max(dp[i][j],dp[i-count[0]][j-count[1]]+1);
                    }
                }
        }
        return dp[m][n];
    }
    public int[] count0And1(String str)
    {
        int[] res=new int[2];
        for(int i=0;i<str.length();i++)
        {
            if(str.charAt(i)=='0')
                res[0]++;
            else res[1]++;
        }
        return res;
    }
}