51nod1268 和为K的组合 折半枚举
来源:互联网 发布:php exec 返回值126 编辑:程序博客网 时间:2024/05/16 13:55
题目:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1268
题意:
给出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”。
思路:
折半枚举预处理,然后二分查找即可
#include <bits/stdc++.h>using namespace std;const int N = 10000 + 10;int a[N], b[N];int arr[N];int work(int *a, int *arr, int m, int len){ int k = 0; for(int i = 0; i < (1<<m); i++) { ++k; for(int j = 0; j < m; j++) if((i>>j) & 1) a[k] += arr[len-j]; } return k;}int main(){ int n, k; while(~ scanf("%d%d", &n, &k)) { for(int i = 1; i <= n; i++) scanf("%d", &arr[i]); memset(a, 0, sizeof a); memset(b, 0, sizeof b); int ka = work(a, arr, n / 2, n / 2); int kb = work(b, arr, n - n/2, n); sort(a + 1, a + 1 + ka); sort(b + 1, b + 1 + kb); bool flag = false; for(int i = 1; i <= ka; i++) { if(binary_search(b + 1, b + 1 + kb, k - a[i])) { flag = true; break; } } puts(flag ? "Yes" : "No"); } return 0;}
阅读全文
0 0
- 51nod1268 和为K的组合 折半枚举
- 51nod1268和为K的组合(枚举)
- 51nod 1268 和为K的组合【Dp/Dfs/折半枚举】
- 51nod 1268 和为K的组合 -dfs枚举
- 和为K的组合 51Nod
- 和为K的组合
- 51Nod 1268 和为K的组合(搜索/+回溯)
- 51 nod 1268 和为k的组合
- 51nod 1268 和为K的组合
- 51Nod-1268-和为K的组合
- 51nod 1268 和为k的组合
- 51nod-【1268 和为K的组合】
- 51nod 1268 和为K的组合
- 51Nod 1268 和为K的组合
- 51nod 1268 和为K的组合
- 51nod 1268 和为k的组合
- 51nod 1268 和为K的组合
- 51nod 1268 和为K的组合 dfs
- python学习笔记--zip()和map()
- 用Python开始机器学习(3:数据拟合与广义线性回归)
- 20170928_替换空格
- 5.搭建集群
- JQ的选择器使用方法整理汇总
- 51nod1268 和为K的组合 折半枚举
- c++堆的实现
- 8大内部排序算法学习笔记--(1)插入排序java实现
- VBA学习4_工作表名:sheet1与sheets(1)有什么不同?
- VMware 最新版本 14 发布啦,此次更新了一个大版本!
- CentOS下svn的安装配置和使用
- python 列表偏平化 & 生成器+装饰器的解决思路
- 数据库实例:用户注册
- 进程间通讯