0041 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
问题描述:
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分钱,则使用3张邮票:3分、3分、4分即可。
输入:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M100.然后是一个数N,N<20,表示有N张邮票。接下来是N个正整数,分别表示着N张邮票的面值,且以升序排列。
输出:
对于每组数据,能够凑成总值M 的最少邮票张数。若无解,输出0.
样例输入:
10
1 3 3 3 4
样例输出:
代码展示:
1 #include2 int fun(int ticket[], int M, int N); 3 int main(){ 4 int M; //总值M 5 int N; //N张票 6 int ticket[N]; //N张票的所有面值 7 int i,j; 8 int count; 9 scanf("%d",&M); 10 scanf("%d",&N); 11 for(i=0;i ){ 12 scanf("%d",&ticket[i]); 13 } 14 count = fun(ticket,M,N); 15 printf("%d\n",count); 16 return 0; 17 } 18 int fun(int ticket[], int M, int N){ 19 int count=0; 20 int i; 21 int total=0; 22 for(i=N-1;i>=0;i--){ 23 if(ticket[i]<=(M-total)){ 24 total += ticket[i]; 25 count++; 26 } 27 if(total == M){ 28 return count; 29 } 30 } 31 return -1; 32 }
运行截图: