邮票问题
本题取材于ICPC(世界赛)95E题
【问题描述】
给定一个信封,最多只允许粘贴N(N<=100)张邮票,我们现在有m(m<=100)种邮票,面值分别为:x1,x2,…….xm分(xi<=255,为正整数),并假设各种邮票都有足够多张.
要求计算所能获得的邮资最大范围,即求最大值MAX,使在1—MAX之间的每一个邮资值都能得到.
例如:N=4,有2种邮票,面值分别为1分,4分,于是可以得到1----10分,和12分,13分,16分的邮资,由于不能得到11分和15分,所有邮资的最大范围是MAX=10.
【样例输入】
从键盘输入一个文本文件的文件名,该文件第1行为最多粘贴的邮票数N;第2行为邮票种数m,以下m行各有一个数字,表示邮票的面值xi.如:
输入:
4
2
1
4
【样例输出】
1. 若最大范围为空,则在屏幕上输出MAX=0
2. 若最大范围不为空,则把结果输出到屏幕上.
输出:
MAX=10.
///f[邮票面值] = 邮票张数
#include <iostream>
#include<cstring>
using namespace std;
int f[110];
int v[110];
int Max;
int main()
{
int n;
cin >> n;
int m;
cin >> m;
for(int i=1; i<=m; i++)
{
cin >> v[i];
}
while(1)
{
Max ++;
for(int i=1; i<=m; i++)
{
if(Max >= v[i])
{
if(f[Max] == 0)
f[Max] = f[Max-v[i]]+1;
f[Max] = min(f[Max],f[Max-v[i]]+1);
}
}
if(f[Max] == 0 || f[Max] > n)
{
cout << Max-1 << endl;
break;
}
}
return 0;
}
/*
4
2
1
4
*/
/*
10
*/