不想多说,直接入正题。
题目大意:给出n个数,求用这n个数(数量无限)不能组成的最大的数是多少。若没有上限或所有数都能组成则输出0.
题解:
只要你知道以下的数论结论,这道题就是水背包了:
有两个数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。
下面附程序:
const maxn=70000; var n,i,s,j,u:longint; a:array[1..10] of longint; f:array[0..maxn] of boolean; begin readln(n); for i:=1 to n do begin readln(a[i]); s:=s+a[i]; end; fillchar(f,sizeof(f),false); f[0]:=true; for i:=1 to n do for j:=a[i] to maxn do f[j]:=f[j] or f[j-a[i]]; for i:=maxn downto 1 do if not f[i] then begin u:=i; break; end; if (u=0)or(u>65024) then writeln(0) else writeln(u); end.