题目描述

Jimmy 到 Symbol 的手表店买手表,Jimmy 只带了 nn 种钱币,第 ii 种钱币的面额为 ki​ 元,张数为 ai​ 张。Symbol 的店里一共有 m 块手表,第 i 块手表的价格为 ti​ 元。

Symbol 的手表店不能找零,所以 Jimmy 只能在凑出恰好的钱数时才能购买一块手表。现在对于店里的每块手表,Jimmy 想知道他能不能凑出恰好的钱数进行购买。

输入格式

第一行两个空格分隔的整数 n 和 m 表示钱币数与手表数。

接下来 nn 行每行两个空格分隔的整数 ki​ 和 ai​ 表示钱币的面额和张数。

第 n+2 行,共 m 个用空格分隔的整数 ti​,表示每块手表的价格。

输出格式

一共 m 行,对于第 i 行,如果能凑出恰好的钱数购买第 i 块手表则输出 Yes 否则输出 No,注意只有首字母大写。

输入样例

3 5
1 2
5 1
6 3
3 19 21 1 7

输出样例

No
Yes
No
Yes
Yes

样例解释

  • 第二块手表 19=6×3+1=6×2+5+1×2,可以恰好凑出。
  • 第四块手表 1=1×1,可以恰好凑出。
  • 第五块手表 7=5+2×1=6×1+1,可以恰好凑出

解法1:

思路分析:此题转化为子集和问题即可解决

C++代码如下:

#include <iostream>
using namespace std;
int x=0,q[100000010],n,m,nn=0;//n为钱币有多少种种类 ,nn为钱币总张数void FixedSum(int* a, int num, int t, int sum)
{if(sum == 0)x=1;else{if(t == num)return ;else{if(sum - a[t] >= 0)FixedSum(a, nn, t + 1, sum - q[t]) ;if(sum >= 0)FixedSum(a, nn, t + 1, sum) ;}}
}int main()
{ cin>>n>>m;int k,a;for(int i=0;i<n;i++){cin>>k>>a;for(int j=0;j<a;j++)//展开储存,如例中6,3转为6,6,6储存{q[nn]=k;nn++;}}for(int i=0;i<m;i++){int sum;cin>>sum;FixedSum(q, nn, 0, sum);if(x)cout<<"Yes"<<endl;elsecout<<"No"<<endl;x=0;}return 0;
}

解法2:

思路分析:

1.此题目可以转换为多重背包问题,然后基于二进制优化

2.什么是二进制优化?

1~n以内的数,都能够通过n进制以内的数组合得到,那我们这里用二进制(n=2)

简单来说,就是把一个数字分成   (1  2  4  8.........最大数) 这样下去的类型

以19为例,如果我们拆分成1,2,4,8,3

其实就是相加小于等于该数的2的幂次方(1,2,4,8)和19与和的差值3

对应到本题目,即a张面额为k的钱币,需要组合出1*k,……a*k。

构造1*k+2*k+……+2∧n+x=a*k

其中,x=a*k- 

3.数据量太大,用bool数组可能得不到满分,我们可以用bitset

C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间

bitset默认构造为0,bitset[i]=1代表可以购买价值i元的手表

我们在组合时,如对于2^j来说

 for(i=500000;i>=0;i--)if(watch[i]==1) watch[i+2^j*k]=1;

这相当于

temp=watch<<j*k;//临时开辟一个数组储存移位后为1的位
watch|=temp;//再进行按位或运算,加上之前为1的位

AC的C++代码如下:

#include<bits/stdc++.h>
using namespace std;
bitset<500005> watch;//默认为1,若值为1代表钱数能凑出
bitset<500005> temp;
int main()
{int n,m,i,j,a,k,t;cin>>n>>m;watch[0]=1;for(i=0;i<n;i++){cin>>k>>a;for(j=1;a>=j;j*=2){temp=watch<<j*k;watch|=temp;a-=j;}if(a*k!=0){temp=watch<<a*k;watch|=temp;} }for(i=0;i<m;i++){cin>>t;if(watch[t])cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

买表(【CCF】NOI Online能力测试3 入门组)相关推荐

  1. 建设城市(city)(【CCF】NOI Online 能力测试2 入门组第三题 )

    时间限制: 1.0 秒 空间限制: 256 MB 题目描述 球球是一位建筑师.一天,他收到市长的任务:建设城市.球球打算建造 2n 座高楼.为了保证城市美观,球球做出了如下计划: 球球喜欢整齐的事物. ...

  2. 未了(endless)(【CCF】NOI Online 能力测试2 入门组第一题 )

    时间限制: 1.0 秒 空间限制: 256 MB 题目描述 由于触犯天神,Sisyphus 将要接受惩罚. 宙斯命 Sisyphus 推一块巨石上长度为 L的山坡.Sisyphus 匀速向上推的速度为 ...

  3. 观星(【CCF】NOI Online能力测试3 入门组)

    题目描述 Jimmy 和 Symbol 约好一起看星星,浩瀚的星空可视为一个长为 N.宽为 M 的矩阵,矩阵中共有 N×M 个位置,一个位置可以用坐标 (i,j)(1≤i≤N,1≤j≤M)来表示.每个 ...

  4. 最急救助(【CCF】NOI Online能力测试3 入门组)

    题目描述 救助中心每天都要收到很多求救信号.收到求救信号后,救助中心会分析求救信号,找出最紧急的求救者给予救助. 求救信号是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成sos的情况越多 ...

  5. 游戏match(【CCF】NOI Online能力测试2 提高组第三题 )

    题目背景 1s 512M 题目描述 小 A 和小 B 正在玩一个游戏:有一棵包含 n=2m个点的有根树(点从1∼n 编号),它的根是 1 号点,初始时两人各拥有 m 个点.游戏的每个回合两人都需要选出 ...

  6. 子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )

    本题代码稍后加入 题目背景 2s 512M 题目描述 给定一个长度为 n的正整数序列 A1, A2, ⋯, An .定义一个函数 f(l,r) 表示:序列中下标在 [l,r]范围内的子区间中,不同的整 ...

  7. 涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )

    子序列问题sequence([CCF]NOI Online能力测试2 提高组第二题 ) 游戏match([CCF]NOI Online能力测试2 提高组第三题 ) 题目背景 1s 256M 题目描述 ...

  8. 优秀子序列(【CCF】NOI Online能力测试3 提高组)

    题目描述 现在请你求出 A 的所有优秀子序列的价值之和,答案对 10^9+7 取模. 输入格式 第一行一个正整数 n 表示序列长度. 第二行 n 个用空格分隔的非负整数,表示 a1​,a2​,⋯,an ...

  9. 魔法值(【CCF】NOI Online能力测试3 提高组)

    题目描述 H 国的交通由 n 座城市与 m 条道路构成,城市与道路都从 1 开始编号,其中 1 号城市是 H 国的首都.H 国中一条道路将把两个不同城市直接相连,且任意两个城市间至多有一条道路. H ...

最新文章

  1. 把ListT转换为DataTable
  2. JDBC 实例--JDBC通过工具类DBUtil连接到数据库,让我们不再恐惧操作数据库
  3. 双系统gazebo闪退_记录Ubuntu16.04下PX4联合Gazebo仿真时遇到的问题与解决方法
  4. c++ vector 先进先出_C++ STL Vector(容器)学习
  5. 终于找全啦!一二线城市知名互联网公司名单!对着找就对了
  6. js对象数组中的某属性值 拼接成字符串
  7. 使用vux组件库常见报错($t)处理
  8. 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
  9. 脚本命令配置mysql_MySQL 自动化部署脚本
  10. MINST数据集下载失败
  11. 例行性工作 排程(crontab)
  12. 不用 Python 自带的 Dict 实现自己的 HashTable
  13. [论文翻译]Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
  14. python路线图_Python路线图
  15. Qt学习之路(21): event()
  16. 转换pdf异常The document appears to be corrupted and cannot be loaded解决
  17. html ui动画效果图,20种炫酷的菜单线条动画特效UI设计效果_html/css_WEB-ITnose
  18. 《视频解密》中文版(第四版) 第七章 数字视频处理(第一部分)
  19. Clickhouse其它类型表引擎(Live View、Null、URL)
  20. Phonetic symbol 清辅音 - θ 与 s

热门文章

  1. python--字符串为空
  2. GDAL源码剖析(五)之Python命令行程序
  3. 如何自定义一个datatable
  4. zz backgroundworker C#
  5. 利用java导入导出excel到oracle数据库
  6. hdu 1186(搜索+HASH)
  7. 8款惊艳的HTML5粒子动画特效
  8. python读取xml文件
  9. 如何在博客中插入数学公式
  10. MyBatis 多表关联相同字段的解决方案