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

Solution

考虑DP。

对于每个值i(1<=i<=s),我们可以枚举j,使得i从i-v[j]增加一个v[j]得来。因此,我们有了下面的代码片段:

for(register int i=; i<=s; i++)
{
for(register int j=; j<=n; j++)
{
if(i-v[j]<)
{
continue;
}
else
{
if(mi[i]>mi[i-v[j]]+)
{
mi[i]=mi[i-v[j]]+; pi[i]=i-v[j];
} if(mx[i]<mx[i-v[j]]+)
{
mx[i]=mx[i-v[j]]+; px[i]=i-v[j];
}
}
}
}

这样一来,题目就迎刃而解了!

Code

 #include <bits/stdc++.h>

 using namespace std;

 inline int read()
{
int f=,x=;
char c=getchar(); while(c<'' || c>'')
{
if(c=='-')f=-;
c=getchar();
} while(c>='' && c<='')
{
x=x*+c-'';
c=getchar();
} return f*x;
} int s1,n,v[],s,a,b,ma,mb,d[],mi[],mx[],pi[],px[];
int an[]; int main()
{
n=read(),s=read(); for(register int i=; i<=n; i++)
{
v[i]=read(); d[v[i]]=i;
} for(register int i=; i<=s; i++)
{
mi[i]=;//组成值i最少需要多少枚硬币
mx[i]=-;//组成值i最多需要多少枚硬币
} mi[]=;
mx[]=; for(register int i=; i<=s; i++)
{
for(register int j=; j<=n; j++)
{
if(i-v[j]<)
{
continue;
}
else
{
if(mi[i]>mi[i-v[j]]+)
{
mi[i]=mi[i-v[j]]+; pi[i]=i-v[j];
} if(mx[i]<mx[i-v[j]]+)
{
mx[i]=mx[i-v[j]]+; px[i]=i-v[j];
}
}
}
} if(mi[s]== || mx[s]==-)//如果组成不了s
{
printf("-1");//输出无解 return ;
} printf("%d %d\n",mi[s],mx[s]);//输出最小组成数
   //输出方案
s1=s; int T=; memset(an,,sizeof(an)); while(s1>)
{
an[++T]=d[s1-pi[s1]]; s1=pi[s1];
} sort(an+,an++T); for(register int i=; i<=T; i++)
{
printf("%d ",an[i]);
} puts(""); s1=s; T=; memset(an,,sizeof(an)); while(s1>)
{
an[++T]=d[s1-px[s1]]; s1=px[s1];
} sort(an+,an++T); for(register int i=; i<=T; i++)
{
printf("%d ",an[i]);
} return ;//结束
}

题解【CJOJ1071/UVA】硬币问题的更多相关文章

  1. 题解 【Uva】硬币问题

    [Uva]硬币问题 Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值 ...

  2. 题解-HNOI2017 抛硬币

    Problem loj2023 题意概述:甲抛掷 \(a\) 次硬币,乙抛掷 \(b\) 次硬币,问有多少种情况甲正面向上的次数比乙多,答案对 \(10^k\) 取模 对于 \(10\%\) 的数据, ...

  3. 【题解】HAOI2008硬币购物

    1A什么的实在是太开心啦~~洛谷P1450 这道题目主要是考察对于容斥原理的掌握. 首先,注意到如果不存在有关硬币数量的限制而单纯询问方案的总数,就是一个简单的完全背包.这个思路提醒我们:如果能够求出 ...

  4. UVA题解三

    UVA题解三 UVA 127 题目描述:\(52\)张扑克牌排成一列,如果一张牌的花色或者数字与左边第一列的最上面的牌相同,则将这张牌移到左边第一列的最上面,如果一张牌的花色或者数字与左边第三列的最上 ...

  5. UVA题解二

    UVA题解二 UVA 110 题目描述:输出一个Pascal程序,该程序能读入不多于\(8\)个数,并输出从小到大排好序后的数.注意:该程序只能用读入语句,输出语句,if语句. solution 模仿 ...

  6. 【codevs1297】硬币 完全背包

    题目大意:给定 N 种不同种类的硬币,每种硬币的重量范围在一个可变区间内,但是价值恒定,求给定一个重量 W,求有多少种面值不同的组合方式. 题解:如果硬币的重量恒定,那么就是一道裸的完全背包问题.因此 ...

  7. HDU 3537 Daizhenyang's Coin 翻硬币博弈

    题意: 给你n个硬币,你可以从中拿出来1.2.3个硬币,它们不一定要连续,你只需要保证拿出来的硬币中那个下标最大的硬币一定要是正面朝上,最后谁不能操作,谁就输了 题解: 翻硬币游戏 结论: 局面的SG ...

  8. [HNOI 2003]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  9. UVA12298 Super Poker II

    怎么又是没人写题解的UVA好题,个人感觉应该是生成函数的大板子题了. 直接做肯定爆炸,考虑来一发优化,我们记一个多项式,其中\(i\)次项的系数就表示对于\(i\)这个数有多少种表示方式. 那么很明显 ...

随机推荐

  1. GYCTF ezupload

    上传一句话,没有任何过滤 菜刀连接后,读取flag文件 bash -c/readflag >tmp cat tmp 上面是非预期的解法.应该是题出问题了.看了一个师傅的blog,看源码,发现预期 ...

  2. redis中获取没有设置ttl过期时间的key

    需求:redis作为一个内存型的数据库,我们需要对过期key保持关注,从info keyspace中可以看出有多少key没有设置过期时间,那么到底是哪些呢? 说明:关于redis ttl 的返回值,请 ...

  3. Hdu2099 整除的尾数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099 Problem Description 一个整数,只知道前几位,不知道末二位,被另一个整数除尽了 ...

  4. Codeforce 25A - IQ test (唯一奇偶)

    Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of th ...

  5. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.23)-- Format NVM command

    5.23 Format NVM command - NVM Command Set Specific Format NVM命令用于低级格式化NVM媒介.这个命令被host主机使用,来变更LBA数据大小 ...

  6. jacob导入项目

    在 resource 下创建一个 lib 将网上下载的 jacob.jar 放入其中 在 pom 文件中导入相对应的 jar 包 <dependency> <groupId>c ...

  7. Abp的swagger UI 出现Failed to load API definition.

    Abp 出现Failed to load API definition.如下图: 原因:本次出现的原因是Api里面的方法重名了(只是方法的参数不一样)(可能是controller中的auction上面 ...

  8. Alan Walker MV 合辑01 by defender 歌词

    其实是歌词浏览,配套Alan Walker MV 合辑01 by defender You were the shadow to my life Did you feel us Another sta ...

  9. 为什么要使用NoSQL数据库

    NoSQL概念 随着web2.0的快速发展,非关系型.分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性(原子性.一致性.隔离性.持久性,一个支持事务的数据库,必需要具有这四种特性,否则 ...

  10. java 学习(day1)

    之前学java没好好听课,会一点又不熟练,于是准备重新开始学一些细节,记录每日所学新知识. a+b java的a+b很有意思,当你输出的是" "+a+b,先假设a=2,b=3.然后 ...