题解 【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)); ...
随机推荐
- [转帖]订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金
订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金 cnbeta 年2月份的新闻 https://www.cnbeta.com/articles/tech/815885.htm 微软 ...
- [转帖]Oracle 起诉 Google 事件
Oracle 起诉 Google 事件 https://www.cnblogs.com/panchanggui/p/9449842.html Oracle 是世界第二大软件公司 世界第一大DBMS公司 ...
- Django 用Session和Cookie分别实现记住用户登录状态
简介 由于http协议的请求是无状态的.故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页时不需再重复进行用户认证).我们可以采用Cookie或Se ...
- CentOS7下使用Harbor搭建Docker私有仓库
相关资料: Harbor官方网站:https://goharbor.io/ Harbor Github地址:https://github.com/goharbor/harbor ⒈安装Docker(必 ...
- Docker 镜像的制作
1.登录docker docker ecex –it 容器名/容器id /bin/bash 例如: docker exec –it t ...
- WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx. GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...
- includes()函数的用法
在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...
- react快速上手一(使用js语法,创建虚拟DOM元素)
1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...
- oracle的listagg函数
今天需要将 BDST_ID相同的PROJECT_ID用逗号分隔拼成一个字符串,于是想到了oracle的listagg函数 表名为PM_BDST_PROJECT select tt.BDST_ID, l ...
- Java,JavaScript和ABAP通过代码取得当前代码的调用栈Callstack
Java StackTraceElement stack[] = Thread.currentThread().getStackTrace(); System.out.println("Ca ...