Skip to content

Commit

Permalink
动态规划空间压缩
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaokexiang committed Jan 14, 2022
1 parent 0405bd0 commit 5823b14
Showing 1 changed file with 30 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,28 +64,52 @@ private static int run3(int[] arr, int target) {
sum += arr[i];
}
// target>sum必定不存在方法数 & target和sum奇偶不同
if (Math.abs(target) > sum || target % 2 != sum % 2) {
if (Math.abs(target) > sum || (target + sum) >> 1 == 0) {
return 0;
}
// 动态规划,[-sum,+sum] -> [0, sum]
return subset(arr, (target + sum) >> 1);
}

/**
* 基于空间优化的动态规划
*/
private static int subset(int[] arr, int target) {
int[] dp = new int[target + 1];
// 不填数字也是一种解法
dp[0] = 1;
for (int k : arr) {
for (int j = target; j >= k; j--) {
dp[j] += dp[j - k];
for (int num : arr) {
for (int j = target; j >= num; j--) {
// 如果target < num 那么肯定不会选取当前的num,也就是不会加上 dp[j - num]
dp[j] += dp[j - num];
}
}
return dp[target];
}

/**
* 没有空间压缩的动态规划
*/
private static int subset2(int[] arr, int target) {
// 填充i=0和j=0的情况
int[][] dp = new int[arr.length + 1][target + 1];
// 第一行第一列特殊处理
dp[0][0] = 1;
for (int i = 1; i <= arr.length; i++) {
for (int j = 0; j <= target; j++) {
// 当arr[i] > j时,没有无论加减都不会满足target,直接选择上一个
dp[i][j] = dp[i - 1][j];
if (j >= arr[i - 1]) {
// 当arr[i] < j时,可以选择arr[i]或者不选择arr[i],因为上面已经不选择了,现在再加上选择的
dp[i][j] += dp[i - 1][j - arr[i - 1]];
}
}
}
return dp[arr.length][target];
}

public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int target = 3;
System.out.println(run3(arr, target));
}
}
}

0 comments on commit 5823b14

Please sign in to comment.