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 货币系统的更多相关文章

  1. 洛谷 P5020 货币系统

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

  2. Luogu P5020 货币系统

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

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

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

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

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

  5. [NOIp2018] luogu P5020 货币系统

    还在补暑假作业. 题目描述 你有一个由 NNN 种面值的货币组成的货币系统.定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时 ...

  6. P5020 货币系统 题解

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

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

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

  8. 洛谷P5020 货币系统

    题目 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成 ...

  9. 洛谷P5020 货币系统 题解 模拟

    题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ...

随机推荐

  1. Golang之初探

    什么是Go语言 Go语言介绍 产生背景: 超级复杂的C++11特性的吹捧报告的鄙视以及最终的目标是具备动态语言的开发速度的同时并要有C/C++编译语言的性能与安全性以及设计网络和多核时代的C语言 Go ...

  2. RecyclerView item独占一行实现

    核心代码: GridLayoutManager manager = new GridLayoutManager(context, 4); manager.setSpanSizeLookup() cla ...

  3. Protocol handler start failedCaused by: java.net.SocketException: Permission denied

    最近在使用mac启动项目的时候,发现原本在Windows下正常跑的项目报错如下: Protocol handler start failedCaused by: java.net.SocketExce ...

  4. Linux内核卸载和禁止更新

    注意:对于可以用好几条命令实现的,第一条命令已经验证,其他的命令参考自网上,没有进行验证. 查看Linux系统内核的命令有下面几条 dpkg --get-selections | grep linux ...

  5. Caffe---Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy

    Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy 为什么需要mean.binaryproto转mean.npy? 使用Caffe的C++接口进行操作时, ...

  6. windows10下成功安装docker splash及遇到问题的解决方案

    转载出处:http://www.cnblogs.com/321lxl/p/9536616.html

  7. 信息: JSF1048:有 PostConstruct/PreDestroy 注释。标有这些注释的 ManagedBeans 方法将表示注释已处理。

    在Myeclipse运行项目时,控制台会输出如下信息,但是项目正常运行,没有异常,还不知道怎么解决 信息: JSF1048:有 PostConstruct/PreDestroy 注释.标有这些注释的 ...

  8. Mybatis一对一和一对多配置

    作者:夕下奕林 问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品. 其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情 ...

  9. mysql查询疯狂41例

    援引自 http://www.cnblogs.com/wupeiqi/articles/5748496.html 一.表关系请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生 ...

  10. MFC 画笔CPen、画刷CBrush

    新建单个文档的MFC应用程序,类视图——View项的属性——消息,WM_PAINT,创建OnPaint()函数 dc默认有一个画笔(实心1像素宽黑线). CPen画笔非实心线像素宽必须为1,否则膨胀接 ...