51nod 1268

1268 和为K的组合 

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 关注
给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。
Input
第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <= 10^9)
第2 - N + 1行:每行1个数,对应数组的元素A[i] (1 <= A[i] <= 10^6)
Output
如果可以,输出:"Yes",否则输出"No"。
Input示例
5 13
2
4
6
8
10
Output示例
No

数量小,可以直接做,用一集合储存现在的和,每遍历一个数就让它和集合里的数都相加。当然,只有小于k的才放进集合里,这个可以少算一些。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[22];
 4 int main() {
 5     int n, k;
 6     set<int> st[2];
 7     set<int> ::iterator it;
 8     cin >> n >> k;
 9     int last = 0;
10     for(int i = 1; i <= n; i ++) cin >> a[i];
11     for(int i = 1; i <= n; i ++) {
12         last = 1 - last;
13         it = st[1-last].begin();
14         for(; it != st[1-last].end(); ++it) {
15             if((*it)+a[i] < k) {
16                 st[last].insert((*it)+a[i]);
17             } else if((*it)+a[i] == k) return 0*printf("Yes\n");
18             st[last].insert((*it));
19         }
20         st[last].insert(a[i]);
21     }
22     if(st[last].count(k)) printf("Yes\n");
23     else printf("No\n");
24     return 0;
25 }

 

posted @ 2018-05-01 16:48  starry_sky  阅读(200)  评论(0编辑  收藏  举报