[NOIP1999]邮票面值设计
题目描述
给定一个信封,最多只允许粘贴N张邮票,计算在给定K种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max,使得1-max之间的每一个邮资值都能得到。
例如,N=3,K=2,如果面值分别为1分、4分,则在l分-6分之间的每一个邮资值都能得到(当然还有8分、9分和12分):如果面值分别为1分、3分,则在1分-7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到连续的邮资最大值,所以max=7,面值分别为l分、3分。
[数据范围]
100%的数据,N + K <= 10
输入格式
输入共一行。
第一行有两个数M、K由空格隔开。含义如前述。
输出格式
输出共两行。
第一行K个数由空格隔开,表示邮票设计方案,要求面值大小升序输出。
第二行输出最大面值max。
【样例】
3 2
1 3
MAX=7
题目描述
给定一个信封,最多只允许粘贴N张邮票,计算在给定K种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max,使得1-max之间的每一个邮资值都能得到。
例如,N=3,K=2,如果面值分别为1分、4分,则在l分-6分之间的每一个邮资值都能得到(当然还有8分、9分和12分):如果面值分别为1分、3分,则在1分-7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到连续的邮资最大值,所以max=7,面值分别为l分、3分。
[数据范围]
100%的数据,N + K <= 10
输入格式
输入共一行。
第一行有两个数M、K由空格隔开。含义如前述。
输出格式
输出共两行。
第一行K个数由空格隔开,表示邮票设计方案,要求面值大小升序输出。
第二行输出最大面值max。
【样例】
3 2
1 3
MAX=7
#include<iostream>
#include<cstring>
using namespace std;
int stamp[41], f[1000], c[1000], t[1000], maxv, n, k;
int main()
{
int i, j, p;
cin>>n>>k; //n张邮票,k种面值
stamp[1] = 1;
for(i=0; i<=n; i++)
f[i] = i;
maxv = n;
for(i=2; i<=k; i++)
{
int nowstamp;
int tmax = maxv; //已确定连续邮资最大值
for(j=stamp[i-1]+1; j<=maxv+1; j++)
{
int nowmax;
for(p=0; p<=maxv; p++)
c[p] = f[p];
for(p=j; ; p++)
{
if(p/j + c[p%j] <= n)
{
c[p] = p / j + c[p%j];
}
else
{
nowmax = p - 1; //前一个p值为最大连续邮资
break;
}
}
if(nowmax > tmax)
{
nowstamp = j;
tmax = nowmax;
for(p=0; p<=tmax; p++)
t[p] = c[p];
}
}
maxv = tmax;
for(p=0; p<=maxv; p++)
f[p] = t[p];
stamp[i] = nowstamp;
}
for(i=1; i<=k; i++)
cout<<stamp[i]<<" ";
cout<<endl<<"MAX="<<maxv<<endl;
return 0;
}

本文探讨了在限制邮票数量N和种类K的情况下,如何设计邮票面值以覆盖1到最大值max之间的所有邮资。通过举例说明了不同面值组合的可能性,并提供了C++代码实现来找到最佳面值方案和最大连续邮资值。

550

被折叠的 条评论
为什么被折叠?



