Day 42 动态规划 part04
今日任务
- 二维数组解决01背包问题
- 一维数组解决01背包问题
-
- 分割等和子集
代码实现
二维数组解决01背包问题
public static int maxValue(int maxWeight, int[] weight, int[] value) {int[][] dp = new int[weight.length][maxWeight + 1];for (int j = 1; j < dp[0].length; j++) {if (weight[0] <= j) {dp[0][j] = value[0];}}for (int i = 1; i < dp.length; i++) {for (int j = 1; j < dp[i].length; j++) {if (weight[i] > j) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);}}}return dp[weight.length - 1][maxWeight];}
一维数组解决01背包问题
代码简洁很多,但是明白二维之后才能更好的理解一维,一维的本质上就是在下一次i的循环中覆盖了上一层的数据
public static int bagProblem(int maxWeight, int[] weight, int[] value) {int[] dp = new int[maxWeight + 1];for (int i = 0; i < weight.length; i++) {for (int j = maxWeight; j >= weight[i]; j--) {dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);}}return dp[maxWeight];}
变异背包问题,重点是理解dp[j]代表什么,物品的重量和价值分别是什么
public boolean canPartition(int[] nums) {int sum = Arrays.stream(nums).sum();if (sum%2 == 1) return false;int target = sum/2;int[] dp = new int[target + 1];for (int num : nums) {for (int j = dp.length - 1; j >= num; j--) {dp[j] = Math.max(dp[j], dp[j - num] + num);}if(dp[target] == target)return true;}return dp[target] == target;}
今日总结
- 背包问题略难,变异的也很难想出来,有一个好处是代码比较简洁还能记得住;
- 今天小亏(其实对我来说也不是小亏了,因为仓位太分散,没什么大赚的时候,大赚也才赚2个点,今天亏1个多点已经很多了),每次节前感觉都不一样,上次是低点,博弈节后的利好,这次是四天不开盘,北向跑路把钱取出来投资别的?