邮票问题

邮票问题

 

本题取材于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
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值