51nod 1268

Posted starry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于51nod 1268的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1268最大距离

51nod 1268 和为K的组合

51nod1268 和为K的组合(DFS)

51nod1563

51Nod1039 N^3 Mod P 数论 原根 BSGS

51nod1174(RMQ)