P5020 货币系统
P5020 货币系统
题解
仔细分析。。。
这道题其实就是求所给数组中有多少个数字不能被该数组中的数字自由组合表示出来
比如样例1

3,10 不能被该集合里的数字表示出来,所以他们组成目标集合
6=3+3 19=10+6+3
那么问题来了,只知道思路不会写(于是我们翻开题解)
solution 1
考虑到对于任意一个数字 x ,如果它能被集合里面的数字表示出来,并且表示它的数字中包含数字 a[i] ,那么 x-a[i] 一定也可以被集合里的数字表示出来
这就涉及到了集合的并集
can[i] 表示数字 i 能不能被表示出来(为什么用can而不是f而不是vis???因为惨)
can[i] = can[i] ∪ can[ i-a[k] ]
注意初始化 can[0]=1
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<cstdlib> using namespace std; typedef long long ll; inline int read(){
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=;
int T,n,ans;
int can[maxn];
int a[]; int main()
{
T=read();
while(T--){
memset(a,,sizeof(a));
memset(can,,sizeof(can));
can[]=;
n=read();ans=n;
for(int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);
for(int i=;i<=n;i++){
if(can[a[i]]) ans--;
else{
for(int j=a[i];j<=maxn;j++)
can[j]=can[j]|can[j-a[i]];
}
}
printf("%d\n",ans);
} return ;
}
solution 2
可以完全背包一下
f[i] 表示数字 i 最多可以被几个数字表示出来
显然上一个做法的结论成立:考虑到对于任意一个数字 x ,如果它能被集合里面的数字表示出来,并且表示它的数字中包含数字 a[i] ,那么 x-a[i] 一定也可以被集合里的数字表示出来
f[i] = max( f[i] , f[i-a[k]]+1 )
那么只能被一个数字表示出来的,显然就是答案啦
注意初始化负无穷 这里用到了指针写法 f i l l
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<cstdlib> using namespace std; typedef long long ll; inline int read(){
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=;
int f[maxn],a[];
int T,n,ans=; int main()
{
T=read();
while(T--){
memset(a,,sizeof(a));
fill(f + , f + maxn + , -);
// memset(f,-0x7f,sizeof(f));
f[]=;
ans=; n=read();
for(int i=;i<=n;i++) a[i]=read(); sort(a+,a+n+); for(int i=;i<=n;i++)
for(int j=a[i];j<=maxn;j++)
f[j]=max(f[j],f[j-a[i]]+); for(int i=;i<=n;i++)
if(f[a[i]]==)
ans++; printf("%d\n",ans);
}
return ;
}
P5020 货币系统的更多相关文章
- 洛谷 P5020 货币系统
题目描述 在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为\(n\).面额数组为 \(a[1..n]\ ...
- Luogu P5020 货币系统
Luogu P5020 货币系统 先把$a$数组排一下序. 从最小的数开始选,显然最小这个数必须选,然后利用完全背包的思想,从$a_i$到最大值筛选一遍,将可以组成的打上标记. 在判断后面的数字时,如 ...
- 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统
题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...
- 【数学】【背包】【NOIP2018】P5020 货币系统
传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...
- [NOIp2018] luogu P5020 货币系统
还在补暑假作业. 题目描述 你有一个由 NNN 种面值的货币组成的货币系统.定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时 ...
- P5020 货币系统 题解
原题链接 简要题意: 求一个长度最小的货币系统与给出的货币系统等价.求这个货币系统的长度.等价的定义详见题目,不再赘述. 本文可能用到一些集合论,请放心食用. 算法一 \(n=2\) 时,只需判断两个 ...
- NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解
题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...
- 洛谷P5020 货币系统
题目 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成 ...
- 洛谷P5020 货币系统 题解 模拟
题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ...
随机推荐
- 系统模块 sys 函数的调用
系统模块 sys 运行时系统相关的信息 sys模块的数据 数据 描述 sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 '' sys.modules 已加载模块的字典 s ...
- c++ 二叉树的遍历(迭代,递归)
#include<iostream> #include <algorithm> #include <vector> #include <set> #in ...
- python主要模块 和 常用方法简览
******************** PY核心模块方法 ******************** os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename ...
- STM32唯一ID(Unique Device ID)的读取方法
每一个STM32微控制器都自带一个96位的唯一ID,也就是Unique Device ID或称为UID,这个唯一ID在任何情况下都是唯一的且不允许修改. 在开发过程中,可能需要用到这个UID,比 ...
- java——spring中bean的作用域
文章:理解Spring框架中Bean的作用域 博客地址:https://baijiahao.baidu.com/s?id=1610298792072480906&wfr=spider& ...
- P4016 负载平衡问题(最小费用最大流)
P4016 负载平衡问题 题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬 ...
- PAT乙级1039
题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805283241443328 题解 用两个字符串表示两个箱子,一 ...
- Tomcat下配置JNDI的三种方式
最近在整理项目上的配置文件,正好看到了数据源配置,想着配置方式有多种,便趁热打铁,记录下常规的Tomcat配置数据源的方式 1.单个工程配置 找到Tomcat下的server.xml文件,在Conte ...
- jQuery.fn.extend() 函数详解
jQuery.fn.extend()函数用于为jQuery扩展一个或多个实例属性和方法(主要用于扩展方法). jQuery.fn是jQuery的原型对象,其extend()方法用于为jQuery的原型 ...
- 详解Object.create(null)
在Vue和Vuex的源码中,作者都使用了Object.create(null)来初始化一个新对象.为什么不用更简洁的{}呢? 在SegmentFault和Stack Overflow等开发者社区中也有 ...