题意

描述

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. xxx.jar或者xxx.war中没有主清单属性和spring-boot-maven-plugin的作用

    因为springboot本身集成了tomcat插件,所以我们可以直接使用mvn clean package命令打成jar包或者war包,然后使java -jar xxx.jar 或者 java -ja ...

  2. Elasticsearch深入搜索之全文搜索及JavaAPI使用

    一.基于词项与基于全文 所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段. 和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以 ...

  3. 在Django中接收文件并存储

    首先是一个views函数的例子 def get_user_profiles(request): if request.method == 'POST': myFile = request.FILES. ...

  4. 让ie8支持 placeholder 属性

    一.  ie8支持 placeholder 属性 /* * ie8支持 placeholder 属性 */ $(function(){ if( !('placeholder' in document. ...

  5. python的shelve模块

    shelve shelve是一额简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的.然后返回一个shelf对象,你可以用他来存储东西,就 ...

  6. (转)Spring Boot 2 (九):【重磅】Spring Boot 2.1.0 权威发布

    http://www.ityouknow.com/springboot/2018/11/03/spring-boot-2.1.html 如果这两天登录 https://start.spring.io/ ...

  7. java访问mysql数据库

    package com.mysql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  8. 数据库索引 引用树形结构 B-数 B+数

    MySQL 为什么使用B+数 B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所谓 ...

  9. Linux最终将会领先于Windows、Mac OS!

    Linux最终将会领先于Windows.Mac OS! 众所周知,硬件离开了软件就像人失去灵魂,而操作系统作为软件中的基础部分,更是重中之重!无论手机.电脑.还是服务器一旦离开了操作系统,比之一堆废铁 ...

  10. Rancher2-----了解什么是rancher以及简单部署

    个人理解:就是相当于openstack的图形化界面,或者说应用程序的图形化界面,rancher功能就是在图形化界面去管理容器,包括运行容器,创建网络,存储等:rancher有个应用商店,可以根据自己的 ...