NOIP2018提高组 货币系统
题目链接:
532. 货币系统 - AcWing题库
在网友的国度中共有 n 种不同面额的货币,第 i 种货币的面额为 a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为 n、面额数组为 a[1..n] 的货币系统记作 (n,a)。 在一个完善的货币系统中,每一个非负整数的金额 x 都应该可以被表示出,即对每一个非负整数 x,都存在 n 个非负整数 t[i] 满足 a[i]×t[i] 的和为 x。然而,在网友的国度中,货币系统可能是不完善的,即可能存在金额 x 不能被该货币系统表示出。例如在货币系统 n=3, a=[2,5,9] 中,金额 1,3 就无法被表示出来。 两个货币系统 (n,a) 和 (m,b) 是等价的,当且仅当对于任意非负整数 x,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。 现在网友们打算简化一下货币系统。他们希望找到一个货币系统 (m,b),满足 (m,b) 与原来的货币系统 (n,a) 等价,且 m 尽可能的小。他们希望你来协助完成这个艰巨的任务:找到最小的 m。输入格式 输入文件的第一行包含一个整数 T,表示数据的组数。接下来按照如下格式分别给出 T 组数据。 每组数据的第一行包含一个正整数 n。接下来一行包含 n 个由空格隔开的正整数 a[i]。输出格式 输出文件共有 T 行,对于每组数据,输出一行一个正整数,表示所有与 (n,a) 等价的货币系统 (m,b) 中,最小的 m。数据范围 1≤n≤100, 1≤a[i]≤25000, 1≤T≤20 输入样例: 2 4 3 19 10 6 5 11 29 13 19 17 输出样例: 2 5
解题思路:
首先我们先明确2个性质:
性质1:对于每一个 b[i] 它不能由 b[0] ~~ b[i - 1] 拼凑出来
性质2:(m, b) 中的每一个数字都是从(n, a) 中选择的。
第一个性质很好理解, 我们来解释一下第二个性质:
假设b[i]由a[j - 1], a[j]拼出,即b[j] = a[j - 1] * k1 + a[j] * k2, K1, K2为正整数(不包括0),
若b[i]不在(n, a)中,则上式可以写成b[j] = a[j - 1] * k1 + a[j] * k2 = b[1] + b[2] + b[3](假设由这三个拼成)则与性质1矛盾,所以性质2成立:
解题步骤:
将从小到大(n,a)从小到大排序,当枚举到a[i]时判断a[i]是否能由a[0] ~~ a[i - 1](里面的任意一个数可选择任意多次)拼出,若能拼出则不选,否则说明可以选择该数。即转化为了完全背包问题的模板:
代码如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N = 110, M = 25010;int n; int v[N]; int f[N][M];int main() {int T;cin >> T;while (T -- ){cin >> n;for (int i = 1; i <= n; i ++ ) cin >> v[i];int res = 0;memset(f, 0, sizeof f);sort(v + 1, v + n + 1);f[0][0] = 1;for (int i = 1; i <= n; i ++ ){if (!f[i - 1][v[i]]) res ++ ;for (int j = 0; j <= v[n]; j ++ ){for (int k = 0; k * v[i] <= j; k ++ ){f[i][j] += f[i - 1][j - v[i] * k];}}}cout << res << endl;}return 0; }
优化后:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N = 110, M = 25010;int n; int v[N]; int f[N][M];int main() {int T;cin >> T;while (T -- ){cin >> n;for (int i = 1; i <= n; i ++ ) cin >> v[i];sort(v + 1, v + n + 1);memset(f, 0, sizeof f);f[0][0] = 1;int res = 0;for (int i = 1; i <= n; i ++ ){if (!f[i - 1][v[i]]) res ++ ;for (int j = 0; j <= v[n]; j ++ ){f[i][j] = f[i - 1][j];if (j >= v[i]) f[i][j] += f[i][j - v[i]];}}cout << res << endl;}return 0; }
再次优化后,完全背包问题最终版:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N = 110, M = 25010;int n; int v[N]; int f[M];int main() {int T;cin >> T;while (T -- ){cin >> n;for (int i = 1; i <= n; i ++ ) cin >> v[i];sort(v + 1, v + n + 1);memset(f, 0, sizeof f);f[0] = 1;int res = 0;for (int i = 1; i <= n; i ++ ){if (!f[v[i]]) res ++ ;for (int j = v[i]; j <= v[n]; j ++ ) f[j] += f[j - v[i]];}cout << res << endl;}return 0; }
NOIP2018提高组 货币系统相关推荐
- NOIP2018提高组比赛总结
NOIP2018提高组比赛总结 前言 新赛季,依旧有很多失误. 在些许的遗憾和无奈中,NOIP2018,撒花结束 纵观今年的整一场NOIP,有许多值得总结的地方 正文 NOIP2018初赛 第二次参加 ...
- NOIP2018提高组心路历程(AFO+自闭)
NOIP2018提高组历程(AFO+自闭) 在不断地考试考试考试(浪浪浪)中,不知不觉,11月9号这个出征日就到来了,再出发前还是有很多小插曲的(比如刚好正面遇到她,吃好饭后还对视了一眼).随着大巴的 ...
- P5049 [NOIP2018 提高组] 旅行
P5049 [NOIP2018 提高组] 旅行 题意: 一棵树(可能是基环树),从1出发,每到达一个新的点就记录下编号.求一种走法使得记录下来的编号字典序最小. 1≤n≤500000 m=n−1 或 ...
- 51Nod NOIP2018提高组省一冲奖班模测训练
51Nod NOIP2018提高组省一冲奖班模测训练 NOIP2018提高组省一冲奖班模测训练1 T1 珂朵莉的旅行 T2 奈芙莲的序列 T3 奈芙莲的护符 NOIP2018提高组省一冲奖班模测训练2 ...
- NOIP2018提高组省一冲奖班模测训练(三)
NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...
- NOIP2018提高组省一冲奖班模测训练2 T3 XYK的音游
10月22日NOIP2018提高组省一冲奖班模测训练2 T3 XYK的音游 题目描述 XYK最近入坑了一个新音游. 游戏界面上有Ñ个并排的按键,当前这首歌有米个鼓点.游戏的玩法是在鼓点的时刻移动鼠标到 ...
- NOIP2018提高组省一冲奖班模测训练(二)
比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态-- 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...
- NOIP2018 提高组游记
NOIP2018 提高组游记的重点不是NOIP而是游记!!! 本文分为 4 个部分: 1.关于2017, 以及自己的简介 2.noip2018游记 3.写给高一高二的学弟学妹 4.写给高三的同学和自己 ...
- NOIP2018提高组省一冲奖班模测训练3 T2 XYG的蛋糕
10月27日NOIP2018提高组省一冲奖班模测训练3 T2 XYG的蛋糕 题目描述 XYG要过生日了,他准备了一个n×m的矩形蛋糕请大家吃. 切蛋糕的方法如下:每次选出已经分出的某一个矩形蛋糕,一刀 ...
最新文章
- C语言 数组(做个笔记)
- ubuntu VMware
- python最基础_python的最基础的知识点
- rpmbuile 制作drbd RPM包
- Smooks转换设计
- mysql sql语句 入门_mysql(3)mysql的sql语句入门
- 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、...
- VS设置程序启动权限为管理员权限
- 计算机应用基础山东大学,山东大学计算机应用基础
- 【Elasticsearch】ES Elasticsearch查询优化
- 2017年蓝桥杯软件B组省赛试题
- 回归分析-常用统计量含义解析
- 2021西工大计算机专硕,计算机专硕2021考研形势分析,考研小白戳
- 实现 Excel 多列数据组合
- 《动态壁纸 : 手机壁纸大全》EULA条款协议
- 基于深度学习的Image Inpainting (图像修复)论文整理与概述
- 一款最好用的windows文件管理器
- [Java Web]AJAX Axios | 一种结合HTML来取代传统JSP的技术
- Fatal message conversion error;message rejected;it will be dropped or routed to a dead letter exchan
- 计算机管理器鼠标不见了怎么办,电脑鼠标箭头不见了的解决方法
热门文章
- 方舟手游服务器gg修改,【修改贴】关于单机版gg修改器的应用。
- Android 判断当前应用是否开启消息通知
- matlab 符号微积分
- 目标检测(四):SSD之Pytorch源码解读
- 2021春招面经系列--计算机网络和操作系统
- hdu4114.Disney's FastPass
- 三万字、91道MySQL面试题(收藏版)
- resultMap使用不当导致出现There is no WRITEABLE property named 'student_id' in class 'com.ssi.model.Stud
- C语言:输入一个整数 求它是几位数
- 电脑黑屏显示重新连接服务器,电脑黑屏怎么处理(电脑上显示器黑屏的处理方法)...