NOIP2018货币系统
题目大意
给出一组数,求出其中共有多少数不能被其他数表示
解题思路
法一:可爱的动态规划
这个思路还是比较好想的(也比较好写?)
有依赖关系的背包,思路这道题是差不多的 填满型01背包
(关于代码) 写起来坑还是比较多的,ans,f记得清零,边界记得写就不说了,转移方程那里
f[j] |= f[j - a[i]];
或符号是一定要加的,举个栗子说明:
以样例为例
a[i] = 3,更新f[3],f[6],f[9],f[12]等等,如果不写或符号, 在a[i]=10更新时会出现 f[12] = f[2] = 0的情况
#include<bits/stdc++.h>
using namespace std;
const int N = ;
#define fr(i,n) for(register int i = 1; i <= n; i++)
int n,t,m,ans,maxn,a[N],f[N]; int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
fr(i,n) scanf("%d",a + i);
sort(a + , a + + n);
ans = ;
memset(f,,sizeof(f)); f[0]=1;
fr(i,n){
if(f[a[i]]) continue;
ans++;
f[a[i]] = ;
for(int j = a[i]; j <= a[n]; j++)
f[j] |= f[j - a[i]]; }
printf("%d\n",ans);
}
return ;
}
法二:
某种筛(原谅数论全忘光的蒟蒻不知道这是哪种)
实际上和背包思路差不多的……然鹅因为是成倍成倍的筛的所以可能快点?emmm
下面是luogu题解大佬 txtxj 的代码(对我真的懒得打)
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mon[]={};
/*
mon[i]=0 表示i面值的钱不能被凑出来
mon[i]=1 表示i面值的钱可以被凑出来
mon[i]=2 表示i面值的钱是货币系统中本来就有的钱
*/
int coins[]={};//存钱的面值
int T,n,ans=;
int main()
{
scanf("%d ",&T);
while (T--)
{
ans=;
memset(mon,,sizeof(mon));
memset(coins,,sizeof(coins));
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&coins[i]);
mon[coins[i]]=;
}
//把货币系统中的钱标好
sort(coins+,coins++n);
for (int i=;i<=coins[n];i++)
{
if (mon[i]>)
//如果mon[i]能被凑出来
//那么mon[i+coins[j]]也能被凑出来
{
for (int j=;j<=n;j++)
if (i+coins[j]<=coins[n])
//防止数组越界
mon[i+coins[j]]=;
else break;
}
}
for (int i=;i<=coins[n];i++)
if (mon[i]==) ans++;
printf("%d\n",ans);
}
}
NOIP2018货币系统的更多相关文章
- 【LG5020】[NOIP2018]货币系统
[LG5020][NOIP2018]货币系统 题面 洛谷 题解 考场上第一眼还不会233 可以发现只要可以被其他的货币通过一些奇奇怪怪的方式表示出来的货币就\(ban\)掉即可 就是个完全背包 我是统 ...
- luogu5020 [NOIp2018]货币系统 (完全背包)
我那个新的货币系统,就是把原来的货币系统中能被其他数表示的数删掉 那我就算有多少数能被别的数表示,那肯定是要被比它小的表示 于是排个序做完全背包就好了 但是我太zz不会完全背包,然后写了个bitset ...
- [NOIp2018]货币系统 背包
LG传送门 完全背包板子题 显然就是判断有多少种面值的货币可以被其他面值的货币表示,完全背包搞一搞就好了. 考场代码(一看这两格缩进就知道是考场代码): #include<cstdio> ...
- 【比赛】NOIP2018 货币系统
可以发现最后的集合一定是给定集合的子集 所以就变成了裸的背包嘛,对于每个数判断它能不能被其它数表示出来,如果可以,就表示这个数是没用的,可以去掉 #include<bits/stdc++.h&g ...
- NOIP2018 货币系统
题面 思路 先分析一下,a集合的子集肯定不存在可以用它来表示的数,a集合是不能够表示的. 所以问题简化了成为选出a的一个子集(个数最少),能够表达a集合所有能表达的数. 接下来继续分析 如:1 2 4 ...
- [NOIp2018提高组]货币系统
[NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...
- 【数学】【背包】【NOIP2018】P5020 货币系统
传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...
- [NOIp2018] luogu P5020 货币系统
还在补暑假作业. 题目描述 你有一个由 NNN 种面值的货币组成的货币系统.定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时 ...
- @NOIP2018 - D1T2@ 货币系统
目录 @题目描述@ @题解@ @代码@ @题目描述@ 在网友的国度中共有 n 种不同面额的货币,第 i 种货币的面额为 a[i],你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 n.面额 ...
随机推荐
- redux的简单使用
Redux 我从学react起,一共写了三次react项目第一次是学生选课系统,完全不知道生命周期的规律和顺序,也不知道axios到底应该放在哪里才能更好的请求到,文件分工不明确,没有体现组件化的优势 ...
- [Linux] CentOS安装GNOME时,fwupdate-efi-12-5.el7.centos.x86_64 conflicts with grub2-common-1:2.02-0.65.el7.centos.noarch
参考文章:https://createdpro.com/a/100006 该问题源于文件的版本冲突: grub2-common包的冲突,所以要将该包使用yum update grub2-commonn ...
- 搭建数据库galera集群
galera集群 galera简介 galera集群又叫多主集群,用于数据库的同步,保证数据安全 最少3台,最好是奇数台数,当一台机器宕掉时,因为仲裁机制,这台机器就会被踢出集群. 通过wsrep协议 ...
- Mac搭建pyhton+selenium+pycharm实现web自动化测试
安装pip或者安装pip3: sudo easy_install pip 二选一安装 sudo easy_install python3-pip 安装selenium: sudo pip3 insta ...
- java项目打包
http://blog.csdn.net/qq_34845382/article/details/53885907 自己用Rinnable JAR file 方法也可以.更简单.直接点击Finish即 ...
- java面向对象,数据类型深入
java程序员面试题day02 1.类和对象有什么区别? java中的类通过class关键字进行定义,代表的是一种抽象的集合,在类中可以定义各种的属性和方法,代表的是每一个类的实例的特定的数据和动作, ...
- 玩转 SpringBoot 2 之整合 JWT 下篇
前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...
- TensorFlow2.0(六):Dataset
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- Redis持久化的方式有哪些?优缺点分别是什么?
Redis持久化方式 持久化的目的主要是做灾难恢复,数据恢复.由于Redis的数据全都放在内存里面,如果Redis挂了,没有配置持久化的话,重启的时候数据会全部丢失. 突 ...
- mac下安装jmeter
jmeter官网下载 双击解压 命令行进入/Users/yanguobin/apache-jmeter-5.1.1/bin目录下,输入sh jmeter即可启动 也可以 配置环境变量 vim ~/.b ...