题目描述
你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个。为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值。
输入输出格式
输入格式:第一行两个数X、N,以下N个数,表示每种硬币的面值。
【数据规模】
对于30%的数据,满足N≤3,X≤20;
对于100%的数据,满足N≤10,X≤1000.
输出格式:最少需要携带的硬币个数,如果无解输出-1.
输入输出样例
输入样例#1:
复制
20 4 1 2 5 10
输出样例#1:
复制
5
正解是贪心,每次拿当前能拿的最大的一个,这样算出来总数肯定是最少的,
如果看代码比较难理解可以试试手推样例
也可以完全背包
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int X,n,a[1002],sum,cnt; 7 int main() 8 {int i,j; 9 cin>>X>>n; 10 for (i=1;i<=n;i++) 11 { 12 scanf("%d",&a[i]); 13 } 14 sort(a+1,a+n+1); 15 for (i=n;i>=1;i--) 16 if (a[i]<=X) break; 17 n=i; 18 if (a[1]!=1) 19 { 20 cout<<-1; 21 return 0; 22 } 23 if (n==1&&a[1]==1) 24 { 25 cout<<X; 26 return 0; 27 } 28 sum=0; 29 a[n+1]=X; 30 for (i=1;i<=n;i++) 31 { 32 while (sum<a[i+1]-1) 33 sum+=a[i],cnt++; 34 } 35 cout<<cnt; 36 }