苹果的分配
Time Limit:1000MS Memory Limit:65536K
Description
有两个人数分别是s1和s2的班级。有一天他们去果园选苹果,苹果是放在一个个框里面的,任何两框的苹果数都不同,管理员叔叔要求他们必须整框拿走,并且每个班只能拿走两框。已知有n框苹果及每框的苹果数,在保证同班同学分得苹果个数一样多的情况下(两个班各自分配苹果,且分配后不得有剩余),他们可以根据各个框中的苹果数来确定取走哪些装着苹果的框。这样取法可能就不只一种了,问有多少种不同的取法?
Input
第一行为两个班的人数(1≤s1,s2≤70),第二行是框数n(n≤40),第三行n个数表示每框的苹果数(≤300),各个数据间都用一个空格隔开。
Output
一行,不同取法总数(没有一种取法满足要求输出零)
Sample Input
41 42
4
11 30 22 20
Sample Output
1
虽然我知道我的程序比较弱智,但是我知道:输入样例过得了,可是就是过不了测试,各位大虾老牛,帮忙看看那里有问题,如果有更好的解法那就再好不过了!就谢谢各位啦!
var
a:array[1..40]of integer;
x:array[1..4]of integer;
b,c,d,e,i:integer;
procedure s(o,p,q:integer);
var
i,j:integer;
begin
for i:=o to p do
begin
x[q]:=a;
if q<4 then s(o+1,p+1,q+1)
else if q=4 then
begin
if ((x[1]+x[2])mod b=0)and((x[3]+x[4])mod c=0) then e:=e+1;
if ((x[1]+x[3])mod b=0)and((x[2]+x[4])mod c=0) then e:=e+1;
if ((x[1]+x[4])mod b=0)and((x[3]+x[2])mod c=0) then e:=e+1;
if ((x[2]+x[3])mod b=0)and((x[1]+x[4])mod c=0) then e:=e+1;
if ((x[4]+x[2])mod b=0)and((x[3]+x[1])mod c=0) then e:=e+1;
if ((x[3]+x[4])mod b=0)and((x[1]+x[2])mod c=0) then e:=e+1;
end;
end;
end;
begin
readln(b,c);
readln(d);
for i:=1 to d do
read(a);
e:=0;
s(1,d-3,1);
writeln(e);
end.