题目:
在计算机界中,我们总是追求用有限的资源获取最大的收益。
现在,假设你分别支配着 m 个 0
和 n 个 1
。另外,还有一个仅包含 0
和 1
字符串的数组。
你的任务是使用给定的 m 个 0
和 n 个 1
,找到能拼出存在于数组中的字符串的最大数量。每个 0
和 1
至多被使用一次。
注意:
- 给定
0
和1
的数量都不会超过100
。 - 给定字符串数组的长度不会超过
600。
分析:
这是我第一次遇到哦01背包问题,想了挺久不过完全没有思路,看了评论区朋友代码的动态转移方程瞬间就懂了...哈哈哈。
不进行方法解释,直接给出代码,忘各位朋友自己理解学习。
代码:
1 //29ms 80% 2 class Solution { 3 public int findMaxForm(String[] strs, int m, int n) { 4 int[][] dp=new int[m+1][n+1]; 5 for(String s:strs) { 6 int numz=0,numo=0; 7 for(char c:s.toCharArray()) { 8 if(c=='0') 9 numz++; 10 else 11 numo++; 12 } 13 for(int i=m;i>=numz;--i) 14 for(int j=n;j>=numo;--j) 15 dp[i][j]=Math.max(dp[i][j], dp[i-numz][j-numo]+1); 16 } 17 return dp[m][n]; 18 } 19 }