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 ;//结束
}

最新文章

  1. SQLServer清空数据库中所有的表并且ID自动归0
  2. 使用MVVM-Sidekick开发Universal App(一)
  3. 关于EditText的一点深入的了解
  4. windows Api AlphaBlend的使用方法
  5. Python数字加千分符
  6. 百度的hao123.com篡改浏览器首页,解决办法
  7. mybatis-spring最新版下载地址
  8. BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]
  9. VO、AO、执行环境和作用域链
  10. springboot打成的jar包如何在Linux上持久运行
  11. 《Go并发编程实战》读书笔记-初识Go语言
  12. HDFS的一些配置文件修改
  13. JQuery复习心得
  14. 2019年19道java经典面试题(附答案)
  15. 初始kafka
  16. Centos7下使用yum安装lnmp zabbix3.2
  17. 如何优雅的控制goroutine的数量
  18. CSS 小结笔记之em
  19. 为你的 Hadoop 集群选择合适的硬件
  20. LUA pcall 多个返回值

热门文章

  1. gulp常用插件之pump使用
  2. ntoskrnl.exe导致蓝屏解决方法
  3. ISCC2018 Reverse &amp; Pwn writeup
  4. Dev 控件笔记1 repositoryItemLookUpEdit 控件
  5. python3-cookbook笔记:第一章 数据结构和算法
  6. 通过otter元数据表获取有用的信息
  7. 51 nod1067 Bash游戏 V2(sg函数打表)
  8. Ubuntu中chrome浏览器安装、卸载
  9. Java判断一个字符串是否有中文
  10. python 处理protobuf协议