还在补暑假作业。

题目描述

你有一个由 NNN 种面值的货币组成的货币系统。定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时不能被表示。尝试从 NNN 种面值中删除尽量多种,使得删除后得到的新系统与原系统等价。求新系统的面值种数。

Solution

一种很显然的想法是,比如 {2,3,5}\{2,3,5\}{2,3,5},因为 2+3=52+3=52+3=5,所以每次我想用 555 的时候我都可以用 2+32+32+3 代替,所以 555 是废的。换句话说,如果一个数可以表示成其他若干个数的和,那么这个数应该被删除。

考虑用深度优先搜索实现这一步骤,可以得到 80 分。时间复杂度 O(Tnn)O(Tn^n)O(Tnn)。

#include<cstdio>
#include<cstdlib>
#include<cstring> const int MAXN=110;
const int MAxm=25010; int T,n;
int a[MAXN+10]; int dfs(int x,int y){
if(x<0) return 0;
if(!x) return 1;
int c=0;
for(int i=1;i<=n;++i){
if(!c&&y!=i) c=dfs(x-a[i],y);
if(c) break;
}
return c;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
int ans=n;
for(int i=1;i<=n;++i)
ans-=dfs(a[i],i);
printf("%d\n",ans);
}
}

设 f[i]f[i]f[i] 表示 iii 这个面值是否可以被表示出来。显然,瓶颈就是求解 fff 数组。

考虑使用动态规划优化此过程。先将 aaa 数组排序,然后 ∀a[i]\forall a[i]∀a[i] 有 f[j]=f[j] or f[i−a[j]]f[j]=f[j]\text{ or }f[i-a[j]]f[j]=f[j] or f[i−a[j]]

这样就可通过此题。设 max⁡a=M=25 000\max a=M=25\ 000maxa=M=25 000,则时间复杂度为 O(TM2)O(TM^2)O(TM2)。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> const int MAXN=110;
const int MAXM=25010; int T,n;
int a[MAXN+10];
int f[MAXM+10]; int dfs(int x,int y){
if(x<0) return 0;
if(!x) return 1;
int c=0;
for(int i=1;i<=n;++i){
if(!c&&y!=i) c=dfs(x-a[i],y);
if(c) break;
}
return c;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
std::sort(a+1,a+n+1);
memset(f,0,sizeof(f));f[0]=1;
int ans=n;
for(int i=1;i<=n;++i){
if(f[a[i]]){
--ans;
continue;
}
for(int j=a[i];j<=a[n];++j)
f[j]=f[j]||f[j-a[i]];
}
printf("%d\n",ans);
}
}

[NOIp2018] luogu P5020 货币系统的更多相关文章

  1. Luogu P5020 货币系统

    Luogu P5020 货币系统 先把$a$数组排一下序. 从最小的数开始选,显然最小这个数必须选,然后利用完全背包的思想,从$a_i$到最大值筛选一遍,将可以组成的打上标记. 在判断后面的数字时,如 ...

  2. 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统

    题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...

  3. 【数学】【背包】【NOIP2018】P5020 货币系统

    传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...

  4. 洛谷 P5020 货币系统

    题目描述 在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为\(n\).面额数组为 \(a[1..n]\ ...

  5. [NOIp2018提高组]货币系统

    [NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...

  6. P5020 货币系统

    P5020 货币系统 题解 仔细分析... 这道题其实就是求所给数组中有多少个数字不能被该数组中的数字自由组合表示出来 比如样例1 3,10 不能被该集合里的数字表示出来,所以他们组成目标集合 6=3 ...

  7. P5020 货币系统 题解

    原题链接 简要题意: 求一个长度最小的货币系统与给出的货币系统等价.求这个货币系统的长度.等价的定义详见题目,不再赘述. 本文可能用到一些集合论,请放心食用. 算法一 \(n=2\) 时,只需判断两个 ...

  8. NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解

    题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...

  9. P5020 货币系统 (NOIP2018)

    传送门 BFS解法 显然如果一个面额A可以被其他面额表示出来 那么这个面额A就没用了 且如果A不能被其他面额表示,那么A一定有用(A本身的值只有自己可以表示) 发现面额最大不超过 25000 那么设 ...

随机推荐

  1. shell中sh, exec, source, fork, ./的区别

    shell中sh, exec, source, fork, ./的区别 1,sh sh test.sh ​ sh是通过创建子进程(subshell)去执行脚本,父进程无法使用子进程中的变量,而子进程对 ...

  2. selenium WebDriver 截取网站的验证码

    在做爬虫项目的时候,有时候会遇到验证码的问题,由于某些网站的验证码是动态生成的,即使是同一个链接,在不同的时间访问可能产生不同的验证码, 一 刚开始的思路就是打开这个验证码的链接,然后通过java代码 ...

  3. MIT-Adobe FiveK Dataset 图片自动下载

    MIT-Adobe FiveK Dataset 图片自动下载 MIT-Adobe FiveK是现在很多做图像增强(image enhancement)与图像修饰(image retouching)方面 ...

  4. 构建之法——homework4

    手机应用——软件腾讯QQ: QQ是腾讯公司开发的一款基于Internet的即时通信软件.最初通过在线广告进行盈利(Banner广告.Email广告等).然后通过免费注册QQ,获取大量用户.开发QQ相关 ...

  5. Gradle 梳理:安装、入门使用方法

    Gradle 教程:第一部分,安装[翻译]   原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-1-installation-se ...

  6. layui-table与layui-rate评分转换成星级的使用

    需求:将layui-table中的某一列,例如:评分,从数据库中查找出来之后,进行layui-rate评分转换显示效果,为星星.显示效果如下: 实现代码: 1.layui中引入rate 2.table ...

  7. springboot 集成Redis单机

    1.redis服务搭建 centos7 搭建redis服务 2.接入相关 pom文件依赖引入 <dependencies> <dependency> <groupId&g ...

  8. hadoop入门之海量Web日志分析 用Hadoop提取KPI统计指标

    转载自:http://blog.fens.me/hadoop-mapreduce-log-kpi/ 今天学习了这一篇博客,写得十分好,照着这篇博客敲了一遍. 发现几个问题, 一是这篇博客中采用的had ...

  9. Android开发——Kotlin开发APP使用笔记

    之前一直使用java来开发Android项目,学了新的kotlin语言,前来试一试,并说一下kotlin对Android的一些功能增强 创建项目 我使用的是Android Studio3.0+,所以默 ...

  10. C语言I博客作业

    |这个作业属于哪个课程 | C语言程序设计I | | ---- | ---- | |对这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/SE2019-2 ...