这个题算是运气吧,因为我就设了个上界10W。
没想到过了,但是不知道什么原理。
题解:
只要你知道以下的数论结论,这道题就是水背包了:
有两个数p,q,且gcd(q,p)=1,则最大无法表示成px+qy(x>=0,y>=0)的数是pq-q-p
(对于n>pq-q-p,都可以表示成px+qy;而pq-q-p,就无法表示成px+qy)。
而且数越多,这个值只会越小。
所以我们只需考虑小于pq-q-p的范围的最小值。对于一些无解的(全体最大公约数>1),或无数解的(有一个‘1’),应提前判断。
其实我们可以干脆全取上界为256*256-256*2。
int main()
{
FILE *fin=fopen("nuggets.in","r");
FILE *fout=fopen("nuggets.out","w");
int num;
int package[12]={0};
int check[100000]={0};
int i ,j;
int ans=0;
fscanf(fin,"%d",&num);
for(i=0;i<num;i++)
{
fscanf(fin,"%d",&package[i]);
check[package[i]]=1;
}
for(i=0;i<num;i++)
{
for(j=1;j<100000;j++)
{
if(j>package[i])
check[j]+=check[j-package[i]];
}
}
for(i=0;i<100000;i++)
{
if(!check[i])
ans=i;
}
if(ans>80000)
ans=0;
fprintf(fout,"%d\n",ans);
return 0;
}