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.面额 ...
随机推荐
- spring aop介绍和示例
参考:<Spring in Action> 一.AOP介绍 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程. 应用中有一些功能使用非常普遍,比如事 ...
- C++基础之关联容器
关联容器 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.ba ...
- JS替换字符串多余的空格符
var str = 'sdfsdfds '; str.replace(/(^\s*)|(\s*$)/g, "");
- Java基本数据类型转换及运算符
上次我们说到完了Java中的基本数据类型,今天我们来说说Java中的基本数据类型转换和Java中的运算符 基本数据类型转换 java中可以从任意基本数据类型转型到外的基本数据类型 注意:(boolea ...
- mysql备份脚本并保留7天
脚本需求: 每天备份mysql数据库,保留7天的脚本. 存放在/opt/dbbak目录中. 脚本名称为database_xxxx-xx-xx.sql 脚本内容: #!/bin/bash export ...
- SpringBoot起飞系列-日志使用(四)
一.SpringBoot中的日志组件 日志是一个系统中不可缺少的组件.在项目中,我们常用的日志组件有JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.. ...
- 【SQL server基础】objectproperty()函数
SQL Server OBJECTPROPERTY使用方法 OBJECTPROPERTY 返回有关当前数据库中的模式作用域对象的信息.此函数不能用于不是模式范围的对象,例如数据定义语言(DDL)触 ...
- php EOF(heredoc)使用
PHP EOF(heredoc)是一种在命令行shell(如sh.csh.ksh.bash.PowerShell和zsh)和程序语言(像Perl.PHP.Python和Ruby)里定义一个字符串的方法 ...
- JS调用activeX实现浏览本地文件夹功能 wekit内核只需要<input type="file" id="files" name="files[]" webkitdirectory/>即可,IE内核比较麻烦
研究了一天,js访问本地文件本身是不可能的,只能借助于插件.植入正题,IE仅支持ActiveX插件. function openDialog() { try { var Message = " ...
- hadoop之yarn详解(框架进阶篇)
前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...