● 1049. 最后一块石头的重量 II
1.dp数组的含义:最大价值dp[j],容量j
dp[j] = max(dp[j],dp[j-weight[i]]+value[i]);
2.dp[j] =max(dp[j],dp[j-weight[i]]+value[i]);// 放这块石头和不放这块石头
3.initial
target只是我们最大容量的一半
class Solution { public int lastStoneWeightII(int[] stones) { int sum = 0; for(int stone:stones){ sum += stone; } int target = sum/2; int[] dp = new int[target+1]; //dp[i]:容量为i的背包的最大价值,规定<=i,since 物品的价值=重量 for(int i = 0;i<stones.length;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];//这里不能是target - dp[target],因为我们不能确保sum是偶数 } }
● 494. 目标和
装满背包有多少种方法
dp[j]:装满容量为j的背包有多少种方法
class Solution { public int findTargetSumWays(int[] nums, int target) { int sum = 0; for(int i = 0;i<nums.length;i++){ sum += nums[i]; } if(target<0 && sum < -target) return 0 ; if((target + sum)%2!=0) return 0; int size = (target + sum) / 2; if(size<0) size = -size; int[] dp = new int[size+1]; dp[0] =1; for(int i = 0;i<nums.length;i++){ for(int j = size;j>=nums[i];j--){ dp[j] += dp[j-nums[i]]; } } return dp[size]; } }
● 474.一和零
class Solution { public int findMaxForm(String[] strs, int m, int n) { int[][] dp = new int[m+1][n+1]; int oneNum,zeroNum; 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); } } } } }
明天再来弄懂,真的有点恶心啊