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 的情况在之前 ...
随机推荐
- boost交叉编译
运行bootstrap.sh # ./bootstrap.sh 生成b2.bjam和project-config.jam文件 修改project-config.jam using gcc : arm ...
- win10 增加一个新磁盘
1.右键我的电脑,选择管理 可以看到C盘的空间相比较大,拿出来250G的空间做成E盘 2.选择OS(C:),右键,压缩卷,请稍后,点击压缩 3.此刻会看到,有一块黑色区域就是新建的未分配空间,这时我们 ...
- Image Processing and Analysis_8_Edge Detection:Finding Edges and Lines in Images by Canny——1983
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- Flutter——Padding组件
在 html 中常见的布局标签都有 padding 属性,但是 Flutter 中很多 Widget 是没有 padding 属性.这个时候我们可以用 Padding 组件处理容器与子元素直接的间距. ...
- 玩转springcloud(二):注册中心-Eureka
一.简介 注册中心 注册中心是服务发现的核心.它保存了各个可用服务实例的网络地址(IP Address和Port).服务注册中心必须要有高可用性和实时更新功能. Netflix Eureka 就是一个 ...
- C# 一个数组集合,任意组合,不遗漏,不重复
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- linux入门常用指令1.配置本地yum源
创建光盘挂载点 [root@localhost /]# mkdir /mnt/cdrom 挂载光盘 #挂载光盘 [root@localhost /]# mount /dev/cdrom /mnt/cd ...
- 4'.deploy.prototxt
1: 神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真 ...
- okhttp拦截器之CallServerInterceptor解析
今天来学习OkHttp的最后一个拦截器,如下: 看一下它的javadoc说明: 其作用有两个:发起网络请求和接收服务器响应,下面具体来看一下它的intercept(): 下面具体来看一下: 接着就是读 ...
- java中的集合总结
知识点: 集合框架和List.set.Map相关集合特点的描述 Collection接口常用方法,List中相对Collection新增的方法,Collection的遍历(一般for循环,增强for循 ...