/*
StampsGiven a set of N stamp values (e.g., {1 cent, 3 cents}) and an upper limit K to the number of stamps that can fit on an envelope, calculate the largest unbroken list of postages from 1 cent to M cents that can be created.
For example, consider stamps whose values are limited to 1 cent and 3 cents; you can use at most 5 stamps. It's easy to see how to assemble postage of 1 through 5 cents (just use that many 1 cent stamps), and successive values aren't much harder:
- 6 = 3 + 3
- 7 = 3 + 3 + 1
- 8 = 3 + 3 + 1 + 1
- 9 = 3 + 3 + 3
- 10 = 3 + 3 + 3 + 1
- 11 = 3 + 3 + 3 + 1 + 1
- 12 = 3 + 3 + 3 + 3
- 13 = 3 + 3 + 3 + 3 + 1.
However, there is no way to make 14 cents of postage with 5 or fewer stamps of value 1 and 3 cents. Thus, for this set of two stamp values and a limit of K=5, the answer is M=13.
The most difficult test case for this problem has a time limit of 3 seconds.
这个题目对内存要求太苛刻,操我就知道不一定够,但是它还刚刚设定到2000000,让你必须开出这么大的内存,我一开始用了int表示,开不出这么大的内存,真是囧。后来发现数组的大小也不能改小。
w了无数次。
*/
/*
ID: niepeng1
PROB:stamps
LANG: C++
*/
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <math.h>
#include <string.h>
#include <stdio.h>
using namespace std;
#define Max1 2000010// 200//
#define MAXSTMP 51
#define min(a,b) a<b?a:b
FILE *in,*out;
struct Node{
Node(){stnum=0xff;cond=false;}
unsigned char stnum;
bool cond;
};
Node form[Max1];
int stamps[MAXSTMP];
//int cmp(const int &a,const int &b){return a>b?1:-1;}
int main()
{
in=fopen("stamps.in","r");
out=fopen("stamps.out","w");
int K,N,i,j;
fscanf(in,"%d %d",&K,&N);
for(i=0;i<N;i++)
{
fscanf(in,"%d",&stamps[i]);
}
// make_heap(stamps,stamps+N,cmp);
sort(stamps,stamps+N);
long int mmax=stamps[N-1];
mmax*=K;
for(i=N-1;i>=0;i--)
{
form[stamps[i]].stnum=1;
form[stamps[i]].cond=true;
for(j=0;j<mmax;j++)
{
if(form[j].cond==true && form[j].stnum < K)
{
form[j+stamps[i]].cond=true;
form[j+stamps[i]].stnum=min(form[j+stamps[i]].stnum,form[j].stnum+1);
}
}
}
for(i=1;i<=min(mmax+1,Max1-1);i++)
{
if(form[i].cond==false && i != 1)
{
fprintf(out,"%d/n",i-1);//cout<<i-1<<endl;
break;
}
}
fclose(in);
fclose(out);
return 0;
}