码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1268

时间:2018-05-01 20:27:52      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:set   clu   col   空间   www   text   black   last   names   

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

标签:set   clu   col   空间   www   text   black   last   names   

原文地址:https://www.cnblogs.com/xingkongyihao/p/8976704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!