题目链接:

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提高组 货币系统相关推荐

  1. NOIP2018提高组比赛总结

    NOIP2018提高组比赛总结 前言 新赛季,依旧有很多失误. 在些许的遗憾和无奈中,NOIP2018,撒花结束 纵观今年的整一场NOIP,有许多值得总结的地方 正文 NOIP2018初赛 第二次参加 ...

  2. NOIP2018提高组心路历程(AFO+自闭)

    NOIP2018提高组历程(AFO+自闭) 在不断地考试考试考试(浪浪浪)中,不知不觉,11月9号这个出征日就到来了,再出发前还是有很多小插曲的(比如刚好正面遇到她,吃好饭后还对视了一眼).随着大巴的 ...

  3. P5049 [NOIP2018 提高组] 旅行

    P5049 [NOIP2018 提高组] 旅行 题意: 一棵树(可能是基环树),从1出发,每到达一个新的点就记录下编号.求一种走法使得记录下来的编号字典序最小. 1≤n≤500000 m=n−1 或 ...

  4. 51Nod NOIP2018提高组省一冲奖班模测训练

    51Nod NOIP2018提高组省一冲奖班模测训练 NOIP2018提高组省一冲奖班模测训练1 T1 珂朵莉的旅行 T2 奈芙莲的序列 T3 奈芙莲的护符 NOIP2018提高组省一冲奖班模测训练2 ...

  5. NOIP2018提高组省一冲奖班模测训练(三)

    NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...

  6. NOIP2018提高组省一冲奖班模测训练2 T3 XYK的音游

    10月22日NOIP2018提高组省一冲奖班模测训练2 T3 XYK的音游 题目描述 XYK最近入坑了一个新音游. 游戏界面上有Ñ个并排的按键,当前这首歌有米个鼓点.游戏的玩法是在鼓点的时刻移动鼠标到 ...

  7. NOIP2018提高组省一冲奖班模测训练(二)

    比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态-- 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...

  8. NOIP2018 提高组游记

    NOIP2018 提高组游记的重点不是NOIP而是游记!!! 本文分为 4 个部分: 1.关于2017, 以及自己的简介 2.noip2018游记 3.写给高一高二的学弟学妹 4.写给高三的同学和自己 ...

  9. NOIP2018提高组省一冲奖班模测训练3 T2 XYG的蛋糕

    10月27日NOIP2018提高组省一冲奖班模测训练3 T2 XYG的蛋糕 题目描述 XYG要过生日了,他准备了一个n×m的矩形蛋糕请大家吃. 切蛋糕的方法如下:每次选出已经分出的某一个矩形蛋糕,一刀 ...

最新文章

  1. C语言 数组(做个笔记)
  2. ubuntu VMware
  3. python最基础_python的最基础的知识点
  4. rpmbuile 制作drbd RPM包
  5. Smooks转换设计
  6. mysql sql语句 入门_mysql(3)mysql的sql语句入门
  7. 写了cookie阻止通过输入地址直接访问下一个html,但是直接输入地址访问时,会闪一下下一个页面,怎么回事啊????、...
  8. VS设置程序启动权限为管理员权限
  9. 计算机应用基础山东大学,山东大学计算机应用基础
  10. 【Elasticsearch】ES Elasticsearch查询优化
  11. 2017年蓝桥杯软件B组省赛试题
  12. 回归分析-常用统计量含义解析
  13. 2021西工大计算机专硕,计算机专硕2021考研形势分析,考研小白戳
  14. 实现 Excel 多列数据组合
  15. 《动态壁纸 : 手机壁纸大全》EULA条款协议
  16. 基于深度学习的Image Inpainting (图像修复)论文整理与概述
  17. 一款最好用的windows文件管理器
  18. [Java Web]AJAX Axios | 一种结合HTML来取代传统JSP的技术
  19. Fatal message conversion error;message rejected;it will be dropped or routed to a dead letter exchan
  20. 计算机管理器鼠标不见了怎么办,电脑鼠标箭头不见了的解决方法

热门文章

  1. 方舟手游服务器gg修改,【修改贴】关于单机版gg修改器的应用。
  2. Android 判断当前应用是否开启消息通知
  3. matlab 符号微积分
  4. 目标检测(四):SSD之Pytorch源码解读
  5. 2021春招面经系列--计算机网络和操作系统
  6. hdu4114.Disney's FastPass
  7. 三万字、91道MySQL面试题(收藏版)
  8. resultMap使用不当导致出现There is no WRITEABLE property named 'student_id' in class 'com.ssi.model.Stud
  9. C语言:输入一个整数 求它是几位数
  10. 电脑黑屏显示重新连接服务器,电脑黑屏怎么处理(电脑上显示器黑屏的处理方法)...