有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
# include <stdio.h>
# define INF 10000
int min(int a, int b){
return (a >b ) ? b : a;
}
int minStamp(int stamp[], int m, int n){
int dp[101];
int i,j;
for(i = 1; i <=m; ++i){
dp[i] = INF;
}
dp[0] = 0;
for(i = 0; i < n; ++i){
for(j = m; j >= stamp[i] ; --j){
if(dp[j - stamp[i]] != INF){
dp[j] = min( dp[j-stamp[i]] + 1 , dp[j]);
}
}
}
return (dp[m] != INF) ? dp[m] :0;
}
int main(void){
int stamp[20];
int m,n,i;
while(scanf("%d%d",&m,&n)!=EOF){
for(i = 0; i< n; ++i){
scanf("%d",&stamp[i]);
}
printf("%d\n",minStamp(stamp,m,n));
}
return 0;
}