1047 邮票面值设计 1999年NOIP全国联赛提高组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1~MAX之间的每一个邮资值都能得到。
例如,N=3,K=2,如果面值分别为1分、4分,则在1分~6分之间的每一个邮资值都能得到(当然还有8分、9分和12分);如果面值分别为1分、3分,则在1分~7分之间的每一个邮资值都能得到。可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大值,所以MAX=7,面值分别为1分、3分。
输入描述 Input Description
N和K
输出描述 Output Description
每种邮票的面值,连续最大能到的面值数。数据保证答案唯一。
样例输入 Sample Input
3 2
样例输出 Sample Output
1 3
MAX=7
这个题没看明白QAQ,以后再看吧==
#include <bits/stdc++.h>
using namespace std;
const int maxn = 505;
const int N = 55;
int a[N],b[N],ans = 0,flag[maxn];
int n,k;
void dfs(int m)
{
memset(flag,0x3f3f3f,sizeof(flag));
flag[0] = 0;
int i;
for( i=1;i<=maxn;i++)
{
for(int j=1;j<=m&&a[j]<=i;j++)
{
flag[i] = min(flag[i],flag[i-a[j]]+1);
}
if(flag[i]>n)
{
i--;
if(i>ans)
{
ans=i;
for(int l=1;l<=m;l++)
{
b[l] = a[l];
}
}
break;
}
}
if(m==k) return;
for(int j=i+1;j>a[m];--j)
{
a[m+1]=j;
dfs(m+1);
}
}
int main()
{
cin>>n>>k;
a[1] = 1;
dfs(1);
for(int i=1;i<=k;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
cout<<"MAX="<<ans<<endl;
return 0;
}