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. Phoenix的jdbc封装

    一.Phoenix版本 <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>p ...

  2. python3 中的cls和self的区别 静态方法和类方法的区别

      一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某 ...

  3. 封装Server类和Client类

    服务器端: EasyTcpServer.hpp #ifndef _EasyTcpServer_hpp_ #define _EasyTcpServer_hpp_ #ifdef _WIN32 #defin ...

  4. 【TCP】连接管理

    TCP连接管理   本节将介绍一条TCP连接是如何建立和拆除的.此处假设客户机A上面的一个进程想要和服务 器B上的一个进程建立一条TCP连接.本文前面介绍的是比较正常的连接和拆除,特殊的会在后面介绍. ...

  5. 10_Hive自定义函数UDF

    Hive官方的UDF手册地址是:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.使用内置函数的快捷方法: 创 ...

  6. linux—-远程连接——管理工具

    1,linux服务器需要安装ssh服务端,端口一般22 2,使用ssh客户端连接linux服务器: 常用工具: putty xshell 3,上传文件工具: 使用sftp,linux需要安装sftp服 ...

  7. HashMap 和 Hashtable 有什么区别?(未完成)

    HashMap 和 Hashtable 有什么区别?(未完成)

  8. Python:出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte问题

    我在导入一个csv文件的时候出现了一个问题 报错的内容是这样的: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in positio ...

  9. JAVA-WEB-简单的四则运算

    首先附上选择题目数量和每行题数的JSP代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...

  10. struts2之登陆拦截

    针对登录拦截功能,我们需要设置拦截哪些方法和不拦截哪些方法 action action类中,处理登录时,将用户.密码绑定到session ActionContext ac = ActionContex ...