文章
39
粉丝
74
获赞
1
访问
19.0k
#include <stdio.h>
#include <stdlib.h>
int m,n;
int a[105];
int dp[105][105];
int min(int a,int b)
{
if(a<=b)return a;
else return b;
}
int main()
{
//dp[i][j]在前i张邮票里面选,刚好满足面值是j的邮票最少个数
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0; i<n; i++)scanf("%d",&a[i]);
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
dp[i][j]=1000;
}
}
dp[0][a[0]]=1;//在第一个里面选出价值为j的邮票,做不到
for(int i=0;i<n;i++)dp[i][0]=0;//在前i个里面选出价值为0的邮票,能做到
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j>=a[i])dp[i][j]=min(dp[i-1][j],dp[i-1][j-a[i]]+1);//因为要求最小值,所以把所有元素初始化为最大的
else dp[i][j]=dp[i-1][j];
}
}
if(dp[n-1][m]==1000)printf("0\n");
else printf("%d\n",dp[n-1][m]);
}
return 0;
}
登录后发布评论
暂无评论,来抢沙发