题意

描述

Baby 今天清点自己的百宝箱啦,箱子里有n 种硬币,硬币的面值分别是:val[1],val[2],...,val[n],每种面值的硬币都恰好有2 个。

Baby 实在闲的太无聊了,他想从他所拥有的硬币中选出若干个,使得面值之和为k。那么他的目标能否实现呢~

输入

先输入T,代表数据一共有T 组,(T ≤ 100)

每一组数据第一行都包含两个数字n(n≤18),k(1≤k≤109)

n 代表箱子中所包含的硬币种数,k 代表Baby 需要组成的金钱数额。

接下来的一行代表val[1],val[2],......,val[n]。(1≤val[i]≤ 10^7)

输出

如果Baby能组成金钱数额k,请输出Yes,否则输出No。

输入样例 1

2

2 10

3 4

3 9

1 2 10

输出样例 1

Case 1: Yes

Case 2: No

分析

每种硬币可以取 0或1或2个

所以有3^18种,暴力复杂度是很高的。所以想办法解决问题

把一半种硬币的各种组合值存在一个set里,其他在另一个set里。

最后看两个set能不能凑到k即可

set.find()的复杂度是log所以降低了整体复杂度

代码

#include<iostream>
#include<set>
using namespace std;
set<int> se1,se2;
int a[20];
void all(int up,int low,int sum,std::set<int> &se){
if(low==up){
se.insert(sum); return;
}
all(up,low+1,sum,se);
all(up,low+1,sum+a[low],se);
all(up,low+1,sum+2*a[low],se);
}
bool ok(int k){
for(set<int> ::iterator it=se1.begin();it!=se1.end();it++){
if(se2.find(k-*it)==se2.end()) continue;
return true;
}
return false;
}
int main(){
int t,n,k,kase=0;
//freopen("in.txt","r",stdin);
cin>>t;
while(t--){
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
bool g=false;
if(n==1){
if(k==a[0]||k==2*a[0]) g=true;
}
else{
se1.clear(),se2.clear();
all(n/2,0,0,se1);
all(n,n/2,0,se2);
g=ok(k);
cout<<"Case "<<++kase<<": "<<(g?"Yes\n":"No\n");
}
}
return 0;
}

Baby Coins的更多相关文章

  1. [LeetCode] Arranging Coins 排列硬币

    You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...

  2. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  3. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  4. csuoj 1119: Collecting Coins

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec  Memo ...

  5. Coins

    Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hi ...

  6. hdu 1398 Square Coins (母函数)

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. (混合背包 多重背包+完全背包)The Fewest Coins (poj 3260)

    http://poj.org/problem?id=3260   Description Farmer John has gone to town to buy some farm supplies. ...

  8. POJ3260The Fewest Coins[背包]

    The Fewest Coins Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 1922 ...

  9. POJ1742 Coins[多重背包可行性]

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 34814   Accepted: 11828 Descripti ...

随机推荐

  1. Android 自定义ListView单击事件失效

    因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目. 出现点击ListView的每一项都不会执行setO ...

  2. iOS图片存在本地、再从本地获取图片

    图片存在本地.再从本地获取图片 //将图片保存到本地 + (void)SaveImageToLocal:(UIImage*)image Keys:(NSString*)key {     NSUser ...

  3. python3中list列表的一些操作

    最近遇到许多List的操作,感觉它是一种很重要的一种基础数据结构,本人掌握的也不是很扎实,这里找了一些列表的操作,常用函数,记录下来,希望对大家有用.如果理解有偏差,欢迎指正,感谢! (1)列表的合并 ...

  4. AndroidNDK开发中使用CMake编译JNI

    虽然一直在做NDK的开发工作,但是由于项目比较久远,都是使用Makefile进行底层编译,对于目前AndroidStudio官方提供的CMake编译方式并不是很了解,现在学习下这种已经不算新潮的新方式 ...

  5. Ubuntu 16.04安装JDK(转载)

    1.简单的安装方法 安装JDK的最简单方法应该就是使用apt-get来安装了,但是源一般是OpenJDK,如果需要安装Oracle的JDK这种方法就不合适了,直接跳过看下面的章节. 1.使用ctrl+ ...

  6. hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)

    关键字:hdfs fsck.block.locations 在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态.获取文件的block信息和位置信息等. fsck命令必须由HDFS ...

  7. 前端数据库——WebSQL和IndexedDB

    一.WebSQL WebSQL是前端的一个独立模块,是web存储方式的一种,我们调试的时候会经常看到,只是一般很少使用.并且,当前只有谷歌支持,ie和火狐均不支持. 我们对数据库的一般概念是后端才会跟 ...

  8. ES5-ES6-ES7_数组的扩展

    Array.prototype.indexOf(value)  得到值在数组中的第一个下标,如果元素不存在返回-1,可以用来判断是否包含指定的元素 var arr = [6,5,4,3,1,7,6]; ...

  9. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  10. RabbitMQ的六种工作模式

    一.基于erlang语言: 是一种支持高并发的语言 RabbitMQ的六种工作模式: 1.1 simple简单模式 消息产生着§将消息放入队列 消息的消费者(consumer) 监听(while) 消 ...