问题描述:
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分钱,则使用3张邮票:3分、3分、4分即可。
输入:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M100.然后是一个数N,N<20,表示有N张邮票。接下来是N个正整数,分别表示着N张邮票的面值,且以升序排列。
输出:
对于每组数据,能够凑成总值M 的最少邮票张数。若无解,输出0.
样例输入:
10
5
1 3 3 3 4
样例输出:
3
代码展示:
1 #include<stdio.h>
2 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<N;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 }
运行截图: