做黄金的经常看什么网站缅甸网站后缀
这里写目录标题
- 题目:
- 题目解析:
- 状态表示:
- 状态转移方程:
- 初始化:
- 填表顺序:
- 返回值:
- 代码呈现:
- 空间优化版本:
- 代码呈现:
题目:
链接: link
题目解析:
分析:该题为,二维费用的背包问题,题目中相比于01背包,多了一个条件
总共有两个条件:子集中,m个0和n个1(m<=0,n<=1)
状态表示:
状态转移方程:
初始化:
填表顺序:
三维数组,一面一面去填,只要保证i从小到大即可
返回值:
返回:dp[lenl[ml[nl
代码呈现:
class Solution {public int findMaxForm(String[] strs, int m, int n) {int len = strs.length;int[][][] dp = new int[len+1][m+1][n+1];for(int i = 1; i <= len; i++){//统计一下每一个字符串中0 和 1的个数int a = 0,b = 0;for(char ch : strs[i-1].toCharArray())if(ch == '0') a++;else b++;for(int j = 0; j <= m; j++)for(int k = 0; k <= n; k++){dp[i][j][k] = dp[i-1][j][k];if(j>=a && k >= b)dp[i][j][k] = Math.max(dp[i-1][j][k], dp[i-1][j-a][k-b]+1);} }return dp[len][m][n]; }
}
空间优化版本:
也属于01背包类型,注意要修改顺序
代码呈现:
//空间优化版本:public int findMaxForm(String[] strs, int m, int n) {int len = strs.length;int[][] dp = new int[m+1][n+1];for(int i = 1; i <= len; i++){//统计一下每一个字符串中0 和 1的个数int a = 0,b = 0;for(char ch : strs[i-1].toCharArray())if(ch == '0') a++;else b++;for(int j = m; j>=a; j--)for(int k = n; k >= b; k--){dp[j][k] = Math.max(dp[j][k], dp[j-a][k-b]+1);} }return dp[m][n]; }