分析
背包问题,但是这里的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; } }