zoukankan      html  css  js  c++  java
  • 0494目标和 Marathon

    给你一个整数数组 nums 和一个整数 target 。

    向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

    例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
    返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

    示例 1:

    输入:nums = [1,1,1,1,1], target = 3
    输出:5
    解释:一共有 5 种方法让最终目标和为 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
    +1 + 1 + 1 + 1 - 1 = 3
    示例 2:

    输入:nums = [1], target = 1
    输出:1

    提示:

    1 <= nums.length <= 20
    0 <= nums[i] <= 1000
    0 <= sum(nums[i]) <= 1000
    -1000 <= target <= 1000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/target-sum

    参考:

    python

    # 0494.目标和
    
    class Solution:
        def findTargetSumWays(self, nums: [int], target: int) -> int:
            """
            动态规划,转化为01背包问题
            :param nums:
            :param target:
            :return:
            """
            sumNum = sum(nums)
            if target > sumNum or target < -sumNum or (sumNum + target) % 2 == 1: return 0
            bagSize = (sumNum+target) // 2
            dp = [0] * (bagSize+1)
            dp[0] = 1
            for i in range(len(nums)):
                for j in range(bagSize, nums[i]-1, -1):
                    dp[j] += dp[j-nums[i]]
            return dp[bagSize]
    
    
    if __name__ == "__main__":
        nums = [100]
        test = Solution()
        print(test.findTargetSumWays(nums, -200))
    
    

    golang

    package dynamicPrograming
    
    // 动态规划
    func findTargetSumWays(nums []int, target int) int {
    	var sum int
    	for _, v := range nums {
    		sum += v
    	}
    	if target > sum || target < -sum || (sum+target) % 2 == 1 {
    		return 0
    	}
    	// 背包大小
    	bagSize := (sum+target) /2
    	// dp array
    	dp := make([]int, bagSize+1)
    	// initial
    	dp[0] = 1
    	// for loop
    	for i:=0;i<len(nums);i++ {
    		for j:=bagSize;j>=nums[i];j-- {
    			// 推导公式
    			dp[j] += dp[j-nums[i]]
    		}
    	}
    	return dp[bagSize]
    }
    
    
  • 相关阅读:
    hdu1251统计难题(trie树)
    线段树
    poj2632Crashing Robots
    UVA10194 Football (aka Soccer)
    hdu1166敌兵布阵(线段树)
    【洛谷P3810】【模板】三维偏序(陌上花开)
    【洛谷P2480】古代猪文
    【洛谷P3449】PALPalindromes
    【洛谷P4777】扩展中国剩余定理(EXCRT)
    【洛谷P2421】荒岛野人
  • 原文地址:https://www.cnblogs.com/davis12/p/15622583.html
Copyright © 2011-2022 走看看