zoukankan      html  css  js  c++  java
  • Medium | LeetCode 494. 目标和 | 动态规划

    494. 目标和

    给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 +-。对于数组中的任意一个整数,你都可以从 +-中选择一个符号添加在前面。

    返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

    示例:

    输入:nums: [1, 1, 1, 1, 1], S: 3
    输出:5
    解释:
    
    -1+1+1+1+1 = 3
    +1-1+1+1+1 = 3
    +1+1-1+1+1 = 3
    +1+1+1-1+1 = 3
    +1+1+1+1-1 = 3
    
    一共有5种方法让最终目标和为3。
    

    提示:

    • 数组非空,且长度不会超过 20 。
    • 初始的数组的和不会超过 1000 。
    • 保证返回的最终结果能被 32 位整数存下。

    方法一

    采用递归的方法暴力枚举

    public class Solution {
        int count = 0;
        public int findTargetSumWays(int[] nums, int S) {
            calculate(nums, 0, 0, S);
            return count;
        }
        public void calculate(int[] nums, int i, int sum, int S) {
            if (i == nums.length) {
                if (sum == S)
                    count++;
            } else {
                calculate(nums, i + 1, sum + nums[i], S);
                calculate(nums, i + 1, sum - nums[i], S);
            }
        }
    }
    

    方法二:0-1背包问题

    使用dp[i][j] 表示前 i 个元素, 组成和为 j 的方案数量。状态方程如下

    dp[i][j] = dp[i - 1][j - nums[i]]   // 当前的第i个数字, 选择+号
    			+ dp[i - 1][j + nums[i]] // 当前的第i个数字, 选择-号
    

    也可写成如下的形式

    dp[i][j - nums[i]] += dp[i-1][j];
    dp[i][j + nums[i]] += dp[i-1][j];
    

    每个dp[i][] 只依赖于 dp[i-1][], 所以使用两个一维数组进行滚动即可。

    public int findTargetSumWays(int[] nums, int S) {
        int[] dp = new int[2001];
        dp[nums[0] + 1000] = 1;
        dp[-nums[0] + 1000] += 1;
        for (int i = 1; i < nums.length; i++) {
            int[] next = new int[2001];
            for (int sum = -1000; sum <= 1000; sum++) {
                if (dp[sum + 1000] > 0) {
                    next[sum + nums[i] + 1000] += dp[sum + 1000];
                    next[sum - nums[i] + 1000] += dp[sum + 1000];
                }
            }
            dp = next;
        }
        return S > 1000 ? 0 : dp[S + 1000];
    }
    
  • 相关阅读:
    Call KernelIoControl in user space in WINCE6.0
    HOW TO:手工删除OCS在AD中的池和其他属性
    关于新版Windows Server 2003 Administration Tools Pack
    关于SQL2008更新一则
    微软发布3款SQL INJECTION攻击检测工具
    HyperV RTM!
    OCS 2007 聊天记录查看工具 OCSMessage
    CoreConfigurator 图形化的 Server Core 配置管理工具
    OC 2007 ADM 管理模板和Live Meeting 2007 ADM 管理模板发布
    Office Communications Server 2007 R2 即将发布
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14336917.html
Copyright © 2011-2022 走看看