http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4432

题解:二分折半查询。每种硬币有三种选择:选择其中一个,选择其中两个,不选择。
因此共有3^18 种,对总的方案折半,以其中一半为基础,对另一半二分查询是
否存在可能使得构成k。

C++版本一

#include <stdio.h>
#include <set>
std::set<int> st1, st2;
int a[20];void dfs(int R, int id, int sum, std::set<int> &st){if (id == R){st.insert(sum);return;}dfs(R, id+1, sum, st);dfs(R, id+1, sum+a[id], st);dfs(R, id+1, sum+2*a[id], st);
}
bool check(int K){for(std::set<int> ::iterator it = st1.begin(); it != st1.end(); it ++){if(st2.find(K-*it) == st2.end()) continue;return true;}return false;
}int main(){
//    freopen("baby_coins.in", "r", stdin);
//    freopen("baby_coins.out", "w", stdout);int T, n, K;int ica = 1;scanf("%d", &T);while(T --){scanf("%d%d", &n, &K);for(int i = 0; i < n; i ++){scanf("%d", &a[i]);}int ok = false;if(n == 1){if(a[0] == K || a[0]*2 == K) ok = 1;}else{dfs(n/2, 0, 0, st1);dfs(n, n/2, 0, st2);ok = check(K);}printf("Case %d: %s\n", ica ++, ok ? "Yes":"No");st1.clear();st2.clear();}return 0;
}

C++版本二

新思路,我发现上面的方法还是太慢了,基本上要跑100-300ms

如果我们把第二次枚举和查找结合,加上C++的逻辑判断机制,可以大大减少时间到100ms以内

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUGusing namespace std;
typedef long long ll;
const int N=20;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,ans;
set<int> st;
int a[N];
void dfs1(int R, int id, int sum){if (id == R){st.insert(sum);return;}dfs1(R, id+1, sum);dfs1(R, id+1, sum+a[id]);dfs1(R, id+1, sum+2*a[id]);
}
bool dfs2(int R, int id, int sum){if (id == R){if(st.find(k-sum) != st.end())return true;return false;}return dfs2(R, id+1, sum)||dfs2(R, id+1, sum+a[id])||dfs2(R, id+1, sum+2*a[id]);
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endifscanf("%d",&t);int T=0;while(t--){scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&a[i]);}ans=0;if(n == 1){if(a[0] == k || a[0]*2 == k) ans = 1;}else{dfs1(n/2, 0, 0);ans=dfs2(n, n/2, 0);}if(ans){cout << "Case "<<++T<<": Yes" << endl;}else{cout << "Case "<<++T<<": No" << endl;}st.clear();}//cout << "Hello world!" << endl;return 0;
}

即使这样依然不是最快的的,大佬已经把时间压缩到56ms,23333

Baby Coins相关推荐

  1. a.Baby Coins

    a: Baby Coins Time Limit: 1 Sec  Memory Limit: 128 MB Description Baby 今天清点自己的百宝箱啦,箱子里有 n 种硬币,硬币的面值分 ...

  2. zstu新生赛 Problem A: Baby Coins(折半枚举+二分)

    Problem A: Baby Coins Time Limit: 1 Sec Memory Limit: 128 MB Submit: 274 Solved: 29 Description Baby ...

  3. LeetCode刷题记录5——441. Arranging Coins(easy)

    LeetCode刷题记录5--441. Arranging Coins(easy) 目录 LeetCode刷题记录5--441. Arranging Coins(easy) 题目 语言 思路 后记 题 ...

  4. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值

    文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...

  5. PAT甲级1068 Find More Coins (30 分):[C++题解]DP、背包问题、dp输出方案

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:m是背包容量,a1,a2,....,ana_1,a_2,....,a_na1​,a2​,....,an​是n个物品,第i个物品的体积是 ...

  6. [watevrCTF 2019]Baby RLWE

    [watevrCTF 2019]Baby RLWE 题目 Mateusz carried a huge jar of small papers with public keys written on ...

  7. [NPUCTF2020]Baby Obfuscation [HDCTF2019]MFC

    文章目录 [NPUCTF2020]Baby Obfuscation 把五个Fox分析一下 F0X1(int a, int b): 运用辗转相除法求得最大公因数(学到一个词汇:最大公约数GCD,最小公倍 ...

  8. 北邮OJ 2016 网预-Square Coins

    时间限制 1000 ms 内存限制 65536 KB 题目描述 Artoria, also known as Saber-chan, was born into a time of chaos and ...

  9. HDOJ 1398 Square Coins

    母函数"第一季",无压力AC~ View Code 1 //#include <fstream> 2 #include <iostream> 3 using ...

最新文章

  1. 解读:为什么要做特征归一化/标准化?
  2. Web纯前端“旭日图”实现元素周期表
  3. JavaScript 位运算总结拾遗
  4. XML解析,dom解析,Jdom解析
  5. hyperic hq mysql_网络管理工具Hyperic HQ监控MySQL配置
  6. CTF——PHP审计——变量覆盖
  7. (百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏
  8. 水电图wp表示什么_装修水电工入门基础知识,刚入行不懂不用急?老师傅告诉你怎么做...
  9. 你会先写PRD,还是先画原型?
  10. 如何查找 MySQL配置文件 my.ini (my.conf)的位置(案例篇)
  11. 使用jquery datatables插件遇到fnReloadAjax的问题
  12. 亚马逊云科技张文翊:云让初创公司不输在起跑线上
  13. mysql配置所有ip连接_Mysql查看用户连接数配置及每个IP的请求情况
  14. python如何实现单例模式_用Python实现设计模式——单例模式
  15. 前端代码更新镜像后,浏览器显示缓存
  16. 软件开发人员如何提高个人和团队工作效率
  17. 为什么程序员要学linux?
  18. 常用m3u8,rtsp,rtmp,flv,mp4直播流在线测试地址
  19. linux修改文件夹属性,Linux修改文件/文件夹属性
  20. 解读蓝牙耳机出口沙特要做什么认证?

热门文章

  1. python用tsne降维_哈工大硕士实现了 11 种经典数据降维算法,源代码库已开放
  2. 自己架设手机网游_起来,不愿做网游的奴隶!
  3. linux网卡O I流量查询,查看linux server网络I/0流量的shell脚本
  4. 扩频技术matlab仿真,基于Simulink的扩频通信仿真
  5. mysql variables 大记录 查询 慢_MySQL - 慢查询
  6. mysql配置kodi16.1_kodi16.1电脑版和机顶盒版安装和使用图文教程
  7. 计算机专硕没有宿舍,没有补贴,不提供宿舍,读研究生还要家里支持,应届生读非全太难...
  8. 二十四、Python数据建模(下),禁止转载
  9. 【Python金融量化 7- 100 】、七、计算两只股票方差和相关性
  10. ​让人惊叹的Johnson-Lindenstrauss引理:应用篇