洛谷 1658 购物
你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个。为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值。
输入格式:
第一行两个数X、N,以下N个数,表示每种硬币的面值。
【数据规模】
对于30%的数据,满足N≤3,X≤20;
对于100%的数据,满足N≤10,X≤1000.
输出格式:
最少需要携带的硬币个数,如果无解输出-1.
5
题解:
这道题我记得我们之前考过,当时傻,所以并不会。就骗了三十分,hhh。
当时是我们区学长出的题,其实我们区除了hmq之外的学长都是挺有人性的。
这道题主要是用到了贪心的思想,
每一次都要在找到比当前该凑数钱小的最大面值数,这样就可以在钱币数量相同的情况下可拼凑价值最大。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 const int maxn=1005; 5 int i,j,n,x,s[maxn],ans,sum; 6 int main() { 7 std::cin>>x>>n; 8 for(i=0; i<n; i++) std::cin>>s[i]; 9 std::sort(s,s+n); 10 if(s[0]!=1) { 11 puts("-1");return 0; 12 } 13 while(sum<x) { 14 for(i=n-1; i>=0; i--) 15 if(s[i]<=sum+1) break; 16 ans++;sum+=s[i]; 17 } 18 printf("%d\n",ans); 19 return 0; 20 }
原文:https://www.cnblogs.com/GTBA/p/9102077.html