题目描述
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
输入描述:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
输出描述:
对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning(disable:4996)
int main()
{
int sum;
int num;
int* value;
int score[101];
int flag = 0;
while (scanf("%d", &sum) != EOF)
{
for (int i = 0; i < 101; ++i)
score[i] = -1;
//initial
score[0] = 0;
flag = 0;
scanf("%d", &num);
value = (int*)malloc(sizeof(int)*num);
for (int i = 0; i < num; ++i)
scanf("%d", value + i);
for (int i = 0; i < num; ++i)
{
for (int j = 101; j >=0; --j)
{
if (score[j] == -1)
continue;
if (j + value[i] > 100)
{
continue;
}
if (score[j + value[i]] == -1)
score[j + value[i]] = score[j] + 1;
else if (score[j + value[i]] > score[j] + 1)
score[j + value[i]] = score[j] + 1;
}
}
if (score[sum] == -1)
printf("0\n");
else
{
printf("%d\n", score[sum]);
}
free(value);
}
}