#5800. 子集和判定

子集和判定


题目:子集和判定(Subset Sum - YES/NO)

题目描述

给定一个长度为 n 的整数数组 a,你可以从中选择若干个元素(每个元素最多选一次,也可以一个都不选),问是否存在一种选择方式,使得所选元素之和 恰好等于 S

如果存在,输出 YES;否则输出 NO


输入格式

第一行输入两个整数 nS。 第二行输入 n 个整数 a0, a1, ..., a(n-1)


输出格式

输出一行:

  • 若存在子集的和为 S,输出 YES
  • 否则输出 NO

数据范围(可用于 OJ)

  • 1 ≤ n ≤ 25
  • -10^9 ≤ a[i] ≤ 10^9
  • -10^9 ≤ S ≤ 10^9

说明:n ≤ 25 暗示可以使用 DFS / 回溯(枚举子集)完成。


样例输入 1

5 9
2 4 6 3 5

样例输出 1

YES

解释:选择 4 + 5 = 9


样例输入 2

4 7
1 2 4 8

样例输出 2

NO

提示

这是一道经典的“子集枚举”题:每个元素只有两种状态——选 / 不选,因此总方案数是 2^n。当 n ≤ 25 时,这样做是可行的。