题目1209:最小邮票数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1559
解决:513
-
题目描述:
-
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
-
输入:
-
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
-
输出:
-
对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
-
样例输入:
-
10 5 1 3 3 3 4
-
样例输出:
-
3
#include <stdio.h> #include <stdlib.h> #include <memory.h> #define INF 9999 int min(int a,int b){return a<b?a:b;} int dp[102];//面值i需要邮票数 int main(void) { int N;//邮票数 int M;//总面值 int i,j; int v[22];//邮票价值 while(scanf("%d%d",&M,&N)!=EOF) { for(i=0;i<N;i++) { scanf("%d",&v[i]); } memset(dp,INF,sizeof(dp)); dp[0]=0; for(i=0;i<N;i++) { for(j=M;j>=0;j--) { if(j>=v[i]) { dp[j]=min(dp[j-v[i]]+1,dp[j]); } } } if(dp[M]<INF) printf("%d\n",dp[M]); else//若无解,输出0。 printf("0\n"); } return 0; } /************************************************************** Problem: 1209 User: ranchothu Language: C Result: Accepted Time:40 ms Memory:912 kb ****************************************************************/