文章
40
粉丝
512
获赞
13
访问
372.9k
#include<stdio.h>
#define INF 1000
int stamp[1000];
int dp[1000];
// 返回最少数量,num表示邮票的个数,deno表示要凑成的面额
int Min_Stamp(int num,int deno){
int i,j;
//将状态全部初始化为最多
for(j=0;j<=deno;++j){
dp[j]= (j==0)?0:INF;
}
for(i=0;i<num;i++){
//从后向前寻找若能凑成,且使数量变少就使用,不能也无所谓因为还是INF
for(j=deno;j>=stamp[i];j--){
if(dp[j-stamp[i]]!=INF)dp[j]=(dp[j] < dp[j-stamp[i]]+1)? dp[j]: dp[j-stamp[i]]+1;
}
}
return dp[deno]==INF?0:dp[deno];
}
int main()
{
int num,deno;
while(scanf("%d %d",&deno,&num)!=EOF){
for(int i=0;i<num;i++)scanf("%d",stamp+i);
printf("%d\n",Min_Stamp(num,deno));
}
return 0;
}
登录后发布评论
暂无评论,来抢沙发