#11954. 部分和问题

部分和问题

部分和问题 (难度:中等) 竞技编程-提高思维

题目描述 给定整数 a1、a2、…、an,判断是否可以从中选出若干数,使它们的和恰好为 k。

输入格式

  • 第一行输入一个整数 n (1 ≤ n ≤ 20),表示数组的大小。
  • 第二行输入 n 个整数 a1, a2, …, an (-10 ≤ ai ≤ 10),表示数组的元素。
  • 第三行输入一个整数 k (-10 ≤ k ≤ 100),表示目标和。

输出格式 如果可以从数组中选出若干个数使得它们的和恰好为 k,输出 "Yes",否则输出 "No"。

示例

输入示例 1:

4  
1 2 4 7  
13

输出示例 1:

Yes

解释:选择 2 + 4 + 7 = 13,满足条件。

输入示例 2:

5  
1 2 3 4 5  
11

输出示例 2:

Yes

解释:选择 2 + 3 + 4 + 5 = 11,满足条件。

输入示例 3:

3  
-1 2 3  
6

输出示例 3:

No

解释:没有任何组合的和等于 6。

时间复杂度分析 由于数组的大小 n 最大为 20,因此可以使用回溯算法(暴力穷举所有组合)来解决此问题。 对于每个元素,可以选择或不选择,因此总共有 2^n 种组合方式。 因此,时间复杂度为 O(2^n),其中 n 是数组的大小,最大值为 20,所以 2^n 的最大值为 1048576,完全可以接受。