题目描述
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
输入描述:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
输出描述:
对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
示例1
输入
10 5 1 3 3 3 4
输出
3
思路:01背包问题。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int dp[1001],stu[1001];
int min(int a,int b)
{
return a<b?a:b;
}
int main() {
int i,j,n,m;
int num=0;
while(~scanf("%d",&m)) {
scanf("%d",&n);
memset(dp,INF,sizeof(dp));
for(i=0;i<n;i++)
{
scanf("%d",&stu[i]);
}
dp[0]=0;
for(i=0;i<n;i++)//遍历邮票值
{
for(j=m;j>=stu[i];j--)//遍历钱币
{
if(dp[j-stu[i]]!=INF)
dp[j]=min(dp[j],dp[j-stu[i]]+1);
}
}
if(dp[m]==INF)
printf("0\n");
else
printf("%d\n",dp[m]);
}
return 0;
}
来源:CSDN
作者:sunshine_lyn
链接:https://blog.csdn.net/sunshine_lyn/article/details/79478019