子集和

进阶

子集和是 0-1 背包的判定版本,只关心"能不能"而非"最大价值"。

子集和

输入数组和目标值(最后一个数),判断子集和是否存在。

AlgoAnim · 子集和

待机

速度
待机
// 源代码
1bool subsetSum(vector<int>& nums, int target) {
2    vector<bool> dp(target + 1, false);
3    dp[0] = true;
4    for (int x : nums)
5        for (int w = target; w >= x; w--)
6            dp[w] = dp[w] || dp[w - x];
7    return dp[target];
8}

复杂度分析

时间 O(n * target)
空间 O(target)
最优 O(n * target)
最坏 O(n * target)

算法讲解

子集和问题要求判断是否可以从数组中选出若干元素,使它们的和恰好等于目标值 target。

DP 用布尔数组 dp[w] 表示"和为 w 是否可达",转移方式和 0-1 背包类似。

它是 NP-Complete 问题的伪多项式解法:时间依赖数值大小而非仅输入长度。

在密码学和近似算法中,子集和问题及其变体有重要应用。