题解 【Uva】硬币问题
【Uva】硬币问题
Description
有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值。
Input
第一行两个整数,n,S(1≤n≤100, 0≤S≤100000)。
第二行n个整数vi-1...n(1≤vi≤S)。
Output
第一行两个整数,分别表示硬币数目的最小值 a 和最大值 b 。无解则输出 -1 。
第二行 a 个整数分别表示使用的是第几种硬币。
第三行 b 个整数分别表示使用的是第几种硬币。
Sample Input
6 12
1 2 3 4 5 6
Sample Output
2 12
6 6
1 1 1 1 1 1 1 1 1 1 1 1
Hint
样例是特殊的,编号和面值是相同的。你编写程序的时候要注意输出编号而不是面值。
结果按编号升序输出字典序小一种。
Source
入门经典,DP,DAG
解析
这题一看就要用DP啊啊!
然而却不知道怎么用qwq!!!
其实可以把它看成是DAG,
每一个点(即不同面值)可以通过许多条权值为1的边到达其它点(即增加一枚硬币)。
因此,只要求最短路和最长路就行了。
另外,硬币的方案可以用一个father数组来记录,只要在更新路径的时候一起更新就行了。
上AC代码:
#include <bits/stdc++.h>
using namespace std; int n,s,v[],num[];
int dmin[]/*最小路径长度*/,famin[]/*上一个硬币*/,ansmin[]/*打印路径*/,mincnt=/*硬币个数*/;
int dmax[],famax[],ansmax[],maxcnt=;/*max和min一样(下同)*/
int que[],vis[]; int main(){
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++){
scanf("%d",&v[i]);
num[v[i]]=i;
}
vis[]=;
memset(dmin,0x3f,sizeof(dmin));
memset(dmax,-0x3f,sizeof(dmax));
dmin[]=;dmax[]=;
for(int i=;i<=s;i++)/*枚举面值*/{
for(int j=;j<=n;j++)/*枚举到达当前面值的方式*/{
int k=i-v[j];
if(k<) break;
if(dmin[i]>dmin[k]+)/*更新*/{
dmin[i]=dmin[k]+;
famin[i]=k;
}
if(dmax[i]<dmax[k]+){
dmax[i]=dmax[k]+;
famax[i]=k;
} }
}
if(dmin[s]==0x3f3f3f3f||dmax[s]==){
printf("-1\n");
return ;
}
printf("%d %d\n",dmin[s],dmax[s]);
for(int i=s;i;i=famin[i])/*打印路径*/{
int k=famin[i];
ansmin[++mincnt]=num[i-k];
}
sort(ansmin+,ansmin+mincnt+);//这一步似乎不需要(重构时懒得删了)
for(int i=;i<=mincnt;i++) printf("%d ",ansmin[i]);
printf("\n");
for(int i=s;i;i=famax[i]){
int k=famax[i];
ansmax[++maxcnt]=num[i-k];
}
sort(ansmax+,ansmax+maxcnt+);
for(int i=;i<=maxcnt;i++) printf("%d ",ansmax[i]);
printf("\n");
}
题解 【Uva】硬币问题的更多相关文章
- [题解]UVa 11082 Matrix Decompressing
开始眨眼一看怎么也不像是网络流的一道题,再怎么看也觉得像是搜索.不过虽然这道题数据范围很小,但也不至于搜索也是可以随随便便就可以过的.(不过这道题应该是special judge,因为一题可以多解而且 ...
- [题解]UVa 10891 Game of Sum
在游戏的任何时刻剩余的都是1 - n中的一个连续子序列.所以可以用dp[i][j]表示在第i个数到第j个数中取数,先手的玩家得到的最大的分值.因为两个人都很聪明,所以等于自己和自己下.基本上每次就都是 ...
- [题解]UVa 10635 Prince and Princess
讲一下题目大意,就是有两个长度为p + 1和q + 1的序列,求它们的LCS. 如果用O(pq)的算法对于这道题来说还是太慢了.所以要另外想一些方法.注意到序列中的所有元素都不相同,所以两个序列中数对 ...
- <题解>[SDOI2017]硬币游戏
solutions 题面(loj) 题面(luogu) 这个题吧是我很久很久以前留下的坑了,到了今天才补好.(是不是太菜了) 暴力 这个和之前的题解一样,确实可以用 trie 树,这复杂度是\(\ma ...
- 题解 $UVA$ 11825【$Hackers$' $Crackdown$】
本题的数学模型是:把\(\mathcal{n}\)个集合\(\mathcal{P1,P2,...,Pn}\)分成尽量多组,使得每组中所以集合的并集等于全集.这里集合\(\mathcal{Pi}\)就是 ...
- [USACO 13NOV]No Change
Description Farmer John is at the market to purchase supplies for his farm. He has in his pocket K c ...
- 【BZOJ1434】[ZJOI2009]染色游戏(博弈论)
[BZOJ1434][ZJOI2009]染色游戏(博弈论) 题面 BZOJ 洛谷 题解 翻硬币的游戏我似乎原来在博客里面提到过,对于这类问题,当前局面的\(SG\)函数就是所有反面朝上的硬币单一存在时 ...
- 题解【CJOJ1071/UVA】硬币问题
P1071 - [Uva]硬币问题 Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目 ...
- hdu 1284 分硬币 && uva 147
#include<bits/stdc++.h> using namespace std; int main() { unsigned ]; memset(dp,,sizeof(dp)); ...
随机推荐
- 【AtCoder】ARC070
ARC070 C - Go Home 题目大意:一只袋鼠第i秒可以向左或向右跳i步或者不跳,问从0跳到x的最小时间 就是1,2,3,4...k总和超过x的最小的k,因为如果超过了x的那部分需要减掉的那 ...
- Timezone offset does not match system offset: 0 != -32400. Please, check your config files
apscheduler使用uWSGI的mule模块部署的时候报错, 因为系统时区和代码运行时区不一样导致. 解决办法:在初始化的时候指定上海的时区 scheduler = BlockingSchedu ...
- 一块40克的砝码,摔成4块,利用天平,刚好可以称出1~40g所有整数克,问:这4块分别是多少克
public static void main(String[] args) { List<Integer> list = new ArrayList<>();//记录每组数的 ...
- 3.解决git不可用问题
升级gityum -y update git 配置阿里云yum源yum -y update nssyum -y update nss curl libcurl
- shell习题第16题:查用户
[题目要求] 写个shell,看看你的Linux系统中是否有自定义的用户(普通用户),如有有的话统计个数 [核心要点] CentOS6,uid>=500 CentOS7,uid>=1000 ...
- WEB监控系列第三篇:graphite指南
一 使用说明 以下是喂数据的方式,但是在实际使用中我们使用statsd来喂数据,请参考我的第四篇文章:statsd指南 喂数据有三种方式: There are three main methods ...
- JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】
[第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...
- 一 ArrayList 及其源码解析
1.数组介绍 因为数组在存储数据时是按顺序存储的,存储的内存也是连续的,所以其特点是读取数据比较容易,插入删除比较困难 2.arraylist源码分析 1)构造方法(默认容量为10) 2)插入数据 扩 ...
- TimeUtil 工具类
/** * TODO * * @auther xh * @date 6/11/19 3:32 PM */ public class TimeUtil { public static final Str ...
- 5.移动端自动化测试-小知识 import和from...import的区别
一.import 1 import导入的时,需要使用模块名的限定. 举个例子,我们首先创建一个md.py文件,里面有一个函数 2 然后在1.py文件中引用这个函数. 注意,我们需要使用md.的方式 ...