时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
有n种硬币,面值为别为a[1],a[2],a[3]……a[n],每种都有无限多。给定非负整数s,可以选取多少个硬币使得面值和恰好为s?输出硬币数目最小值和最大值
输入格式
第1行n
第2行s
第3到n+2行为n种不同的面值
第2行s
第3到n+2行为n种不同的面值
输出格式
第1行为最小值
第2行为最大值
第2行为最大值
测试样例1
输入
3
6
1
2
3
输出
2
6
备注
1<=n<=100
1<=s<=10000
1<=a[i]<=s
1<=s<=10000
1<=a[i]<=s
1 #include<iostream>
2 using namespace std;
3 #include<cstdio>
4 #include<cstring>
5 #define N 105
6 #define S 10010
7 int n,s,a[N];
8 int minv[S],maxv[S];
9 int main()
10 {
11 scanf("%d%d",&n,&s);
12 for(int i=1;i<=n;++i)
13 scanf("%d",&a[i]);
14 memset(minv,99,sizeof(minv));
15 memset(maxv,-99,sizeof(maxv));
16 minv[0]=maxv[0]=0;
17 for(int i=1;i<=s;++i)
18 for(int j=1;j<=n;++j)
19 if(i>=a[j])
20 {
21 minv[i]=min(minv[i],minv[i-a[j]]+1);
22 maxv[i]=max(maxv[i],maxv[i-a[j]]+1);
23 }
24 printf("%d
%d",minv[s],maxv[s]);
25 return 0;
26 }