题解 【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)); ...
随机推荐
- SQL0668N Operation not allowed for reason code "3" on table "TEST". SQLSTATE=57016
问题描述: 查询,操作表都报如下错误 SQL0668N Operation not allowed for reason code "3" on table "TEST ...
- php gd实现简单图片验证码与图片背景文字水印
1.让水印文字铺满图片: 大致效果: 代码: <?php function appendSpreadTextMark($imageDir, $markText) { $fontFile = &q ...
- Linux 网络工具netcat(nc)的应用
NETCAT netcat是Linux常用的网络工具之一,它能通过TCP和UDP在网络中读写数据,通过与其他工具结合和重定向,可以在脚本中以多种方式使用它. netcat所做的就是在两台电脑之间建立链 ...
- 【leetcode】153. 寻找旋转排序数组中的最小值
题目链接:传送门 题目描述 现有一个有序数组,假设从某个数开始将它后面的数按顺序放到了数组前面.(即 [0,1,2,4,5,6,7] 可能变成 [4,5,6,7,0,1,2]). 请找出数组中的最小元 ...
- VIM纵向编辑【转】
原文:https://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html Vim 的纵向编辑模式启动方便,使用灵活,还可以配合上 ...
- java项目上线的流程(将web项目部署到公网)
本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. ...
- 三调数据库标注插件v1.3
三调数据库标注插件 插件介绍: 本插件基于VS2010+ARCGIS Addin 开发,高效率处理三调数据,可以标注相关属性.检查尖角.检查节点平均密度.检查地类图斑属性一致性,方便数据导入建库软件之 ...
- kubernetes 实现redis-statefulset集群
Kubernetes 通过statefulset部署redis cluster集群 部署redis集群方式的选择 Statefulset Service&depolyment 对于redis, ...
- 可运行jar包转.exe
1.工具:launch4j.exe 2.导出可运行jar包(runable Jar file) 3.截图: 4.生成结果:
- php压缩图片
<?php header('content-type:text/html;charset=utf8'); set_time_limit(0); $imgs=scandir('./Public/u ...