题目:
题目描述
Mr_he 因讨厌马云而彻底放弃网购,他的日常用品都要到商场去购买, 而且必须付现金。但是现金购买,经常会遇到找零的问题,那么现在请 你帮助他解决这样一个问题:
现在Mr_he 手上有n 种不同面值的硬币,每种硬币有无限多个。为了 方便购物,他希望带尽量少的硬币,但是要能组合出1 到 m 之间的任 意值。
输入输出格式
输入格式:
第一行为两个整数:m 和n,他们的意义如题目描述。 接下来的 n 行,每行一个整数,第 i+1 行的整数表示第 i 种硬币的面 值。
输出格式:
最少需要携带的硬币数量,如果无解则输出-1。
输入输出样例
输入样例#1:
20 4
1
2
5
10
输出样例#1:
5
说明
50%的数据:1<=n<=10, 1<=m<=10^3;
100%的数据:1<=n<=100,1<=m<=10^9;
思路:
sum表示当前硬币可以拼出1~sum的所有数。
然后再取刚好小于sum的硬币就好。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define read(x) scanf("%d",&x)
int m,n;
int a[maxn+5];
int main() {
read(m),read(n);
for(int i=1;i<=n;i++) read(a[i]);
sort(a+1,a+n+1);
if(a[1]!=1) {printf("-1"); return 0;}
while(a[n]>m) n--;
a[n+1]=(1<<30);
int ans=0,c=0;
while(c<m) {
int x=upper_bound(a+1,a+n+1,c+1)-a;
c+=a[x-1],ans++;
}
printf("%d",ans);
return 0;
}