最小邮票数(动态规划)

只谈情不闲聊 提交于 2019-12-07 12:22:58

题目描述

    有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。     如,有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;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!