- 最后一块石头的重量 II
class Solution {
public int lastStoneWeightII(int[] stones) {
int sum = 0;
for(int e : stones){
sum += e;
}
int target = sum/2;
int len = stones.length;
//装满target的最大价值
int[] dp = new int[target + 1];
//递推公式
//dp[j] = max(dp[j],dp[j-stone[i]]) + stone[i];
//初始化
dp[0] =0;
for(int i = 0;i<len;i++){
for(int j = target;j>=stones[i];j--){
dp[j] = Math.max(dp[j],dp[j-stones[i]] + stones[i]);
}
}
return sum - 2 * dp[target];
}
}
- 目标和
class Solution {
public int findTargetSumWays(int[] nums, int target) {
//dp[j] 装满背包dp[j]有多少种方法
int sum = 0;
for(int i : nums){
sum += i;
}
if((target + sum)%2 == 1 || Math.abs(target) > sum) return 0;
int len =( target + sum) /2;
int[] dp = new int[len +1];
dp[0] = 1;
for(int i = 0;i<nums.length;i++){
for(int j = len;j>=nums[i] ;j--){
dp[j] += dp[j-nums[i]];
}
}
return dp[len];
}
}
474.一和零
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
//dp[i][j]含义:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
int dp[][] = new int[m+1][n+1];
int oneNum = 0; int zeroNum = 0;
for(String str: strs){
oneNum = 0; zeroNum = 0;
for(char ch : str.toCharArray()){
if(ch == '0') zeroNum ++;
else oneNum ++;
}
for(int i = m;i>= zeroNum;i--){
for(int j = n;j>=oneNum;j--){
dp[i][j] = Math.max(dp[i][j],dp[i - zeroNum][j - oneNum]+1);
}
}
}
return dp[m][n];
}
}