494. 目标和

不念不忘少年蓝@ 2022-12-02 01:12 175阅读 0赞

题目:

494. 目标和
在这里插入图片描述

题解:

1. 题解一:DFS枚举

在这里插入图片描述

2. 题解二:动态规划(首选)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

1. 代码一:DFS枚举

  1. public class code494 {
  2. // 方法一: DFS枚举
  3. public int count = 0;
  4. public int findTargetSumWays(int[] nums, int S)
  5. {
  6. dfs(nums, S, 0, 0);
  7. return count;
  8. }
  9. public void dfs(int nums[], int S, int i, int sum)
  10. {
  11. if(i == nums.length && sum == S)
  12. {
  13. count++;
  14. return;
  15. }
  16. if(i == nums.length)
  17. {
  18. return;
  19. }
  20. dfs(nums, S, i + 1, sum + nums[i]);
  21. dfs(nums, S, i + 1, sum - nums[i]);
  22. }
  23. public static void main(String[] args) {
  24. int nums[] = { 1, 1, 1, 1, 1 };
  25. int S = 3;
  26. code494 test = new code494();
  27. int res = test.findTargetSumWays(nums, S);
  28. System.out.println(res);
  29. }
  30. }

2. 代码二:动态规划(首选)

  1. public class code494 {
  2. // 方法二: 动态规划
  3. public int findTargetSumWays(int[] nums, int S) {
  4. int sum = 0;
  5. for(int i = 0; i < nums.length; i++)
  6. {
  7. sum = sum + nums[i];
  8. }
  9. // 绝对值范围超过了sum的绝对值范围则无法得到
  10. if(Math.abs(S) > Math.abs(sum))
  11. {
  12. return 0;
  13. }
  14. int len = nums.length;
  15. // - 0 +
  16. int target = sum * 2 + 1;
  17. // dp[i][j]: 从数组 nums 中 0 —— i 的元素(前 i 个元素)进行加减,可以得到 j 的方法数量。
  18. int dp[][] = new int[len][target];
  19. // 初始化
  20. if(nums[0] == 0)
  21. {
  22. dp[0][sum] = 2; // 如果 nums[0] == 0 那么 dp[0][sum] 需要初始化为2,因为加减 0 都得0。
  23. }
  24. // 初始化表格的第一行,sum表示的是表格中【0】所在的那一列的下标;
  25. // 而对 nums[0] 执行加减呢,是因为当前 nums[0] 这个数可以执行一次加,也可以执行一次减;
  26. // 而为什么赋值为 1 呢,是因为当前这个 nums[0] 能够得到对应的值的情况只有一种。
  27. else
  28. {
  29. dp[0][sum + nums[0]] = 1;
  30. dp[0][sum - nums[0]] = 1;
  31. }
  32. for(int i = 1; i < len; i++)
  33. {
  34. for(int j = 0; j < target; j++)
  35. {
  36. // 边界处理
  37. int left = (j - nums[i]) >= 0 ? j - nums[i]: 0;
  38. int right = (j + nums[i]) < target ? j + nums[i]: 0;
  39. // nums[i] 这个元素我可以执行加,还可以执行减,那么 dp[i][j] 的结果值就是加/减之后对应位置的和。
  40. dp[i][j] = dp[i - 1][left] + dp[i - 1][right];
  41. }
  42. }
  43. return dp[len - 1][sum + S];
  44. }
  45. public static void main(String[] args) {
  46. int nums[] = { 1, 1, 1, 1, 1 };
  47. int S = 3;
  48. code494 test = new code494();
  49. int res = test.findTargetSumWays(nums, S);
  50. System.out.println(res);
  51. }
  52. }

参考:

  1. 目标和
  2. 换一下角度,可以转换为典型的01背包问题
  3. 动态规划思考全过程
  4. C++ dfs和01背包
  5. 背包打卡题2:0-1背包恰好装满背包的方案数
  6. 494. 目标和
  7. Python3 DFS 与 01背包 与 动态规划 三种方法详解
  8. 动态规划击败了98%的java用户

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读

    相关 494.目标

    ![在这里插入图片描述][67f4b8e3f6ed4ccd9f395c038504f144.png] 1. 回溯算法 这题和之前做的那些排列、组合的回溯稍微有些不同,你

    相关 494. 目标

    给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums =