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 }