LeetCode 494. 目标和

对于这题,我们可以用回溯解决,枚举所有的 + - 组合,求出答案等于target的组合个数。也可以利用动态规划来解决,且更高效。

对于 nums ,我们可以依据每个元素前面的符号来将其分为两个集合P Q,其中P为前面加正号的数,Q为前面加负号的数。

故sum(P)−sum(Q)=targetsum(P) - sum(Q) = targetsum(P)−sum(Q)=target。

又因为sum(P)+sum(Q)=sum(nums)sum(P) + sum(Q) = sum(nums)sum(P)+sum(Q)=sum(nums)

则2×sum(P)=target+sum(nums)2\times sum(P) = target + sum(nums)2×sum(P)=target+sum(nums)

其结构与 416. 分割等和子集 一模一样。

c++ 复制代码
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum = target + accumulate(nums.begin(), nums.end(), 0);
        if(sum%2 || sum<0) return 0;
        sum /= 2;
        vector<int> dp(sum + 1, 0);
        dp[0] = 1;
        for(auto x : nums){
            for(int i = sum;i >= x;i--){
                dp[i] = dp[i] + dp[i-x];
            }
        }
        return dp[sum];
    }
};
相关推荐
Coder_Shenshen3 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
硕风和炜4 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
我是一颗柠檬5 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农5 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
凯瑟琳.奥古斯特6 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
Jerry7 小时前
LeetCode 203. 移除链表元素
算法
地平线开发者7 小时前
征程 6 | 工具链 QAT ObserverBase 源码解析
算法
地平线开发者8 小时前
【地平线 征程 6 工具链进阶教程】QAT 训练常见问题和排查
算法
地平线开发者8 小时前
征程 6 | 直方图量化配置与校准实例
算法