【题目描述】

农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块。奶牛们正在想尽一切办法让这种可怕的设想泡汤。奶牛们进行斗争的策略之一是“劣质的包装”。“看,”奶牛们说,“如果你只用一次能装3块、6块或者10块的三种包装盒包装麦香牛块,你就不可能满足一次只想买1、2、4、5、7、8、11、14或者17块麦香牛块的顾客了。劣质的包装意味着劣质的产品。”

你的任务是帮助这些奶牛。给出包装盒的种类数N(1<=N<=10)和N个代表不同种类包装盒容纳麦香牛块个数的正整数(1<=i<=256),输出顾客不能用上述包装盒(每种盒子数量无限)买到麦香牛块的最大块数。如果所有购买方案都能得到满足或者不存在不能买到块数的上限,则输出0。不能买到的最大块数(倘它存在)不超过2,000,000,000。

【解题报告】

蛋碎的一个题。

引理:对于2个自然数q,p,若gcd(q,p)=1,则不能用xq+yp(x,y为任意自然数)的最大数为q*p-q-p。

 1 {
2 ID:wwzhwdw1
3 PROG:nuggets
4 LANG:PASCAL
5 }
6 program nuggets;
7 var
8 maxn,j,n,i:longint;
9 a:array[0..11]of longint;
10 f:array[0..90000]of boolean;
11
12 procedure init;
13 begin
14 assign(input,'nuggets.in');
15 reset(input);
16 assign(output,'nuggets.out');
17 rewrite(output);
18 end;
19
20 procedure outit;
21 begin
22 halt;
23 close(input);
24 close(output);
25 end;
26
27 function min(a,b:longint):longint;
28 begin
29 if a<b then exit(a);
30 exit(b);
31 end;
32
33 function gcd(a,b:longint):longint;
34 begin
35 if b=0 then gcd:=a
36 else
37 gcd:=gcd(b,a mod b);
38 end;
39
40 procedure main;
41 begin
42 readln(n);
43 for i:=1 to n do
44 begin
45 readln(a[i]);
46 if a[i]=1 then
47 begin
48 writeln(0);
49 outit;
50 end;
51 end;
52 maxn:=maxlongint;
53 for i:=1 to n-1 do
54 for j:=i+1 to n do
55 begin
56 if gcd(a[i],a[j])=1 then maxn:=min(maxn,a[i]*a[j]-a[i]-a[j]);
57 end;
58 if maxn=maxlongint then
59 begin
60 writeln(0);
61 outit;
62 end;
63 fillchar(f,sizeof(f),0);
64 f[0]:=true;
65 for i:=1 to n do
66 for j:=a[i] to maxn do if f[j-a[i]] then f[j]:=true;
67 for i:=maxn downto 1 do if (not f[i]) then
68 begin
69 writeln(i);
70 outit;
71 end;
72 writeln(0);
73 end;
74
75 begin
76 init;
77 main;
78 outit;
79 end.
80
81