Description
凯萨拥有一支由n个人组成的雇佣军,他们靠在威尼斯商行接任务过活。这支军队的成份比较复杂,不同的人往往具有不同的技能,有的人还拥有多项技能。威尼斯商行的任务也参差不齐,有的需要几个人合作完成,有的只需要一个人独立完成:有的很简单,不需要耗多少时间,因此报酬也较低,有的很有难度,需要多个人长期合作完成,因此报酬就高。完成这些任务的时间不会超过一个月。并且,一个人不能同时执行两项任务,也不能中途加入或者退出任务。但可以不执行任何任务。一项只需要n个人来完成的任务,如果执行该任务的人数p大于n,那么反而会得到更少的报酬,即原报酬的1/(p-n+1)。
凯萨是一位英明的领袖,他往往在每个月的月底召开军事会议,总结上个月的成果,发给大家报酬,并指派下个月的任务。
请问,凯萨应该怎样指派任务,才能使总报酬最高?总报酬为多少?
Input
一行包含两个正整数n,m。彼此用空格隔开,其中n〈10表示雇佣军的人数,m〈15表示下个月可选的任务数。接下来的n行中,第i行(对应整个文件的第i+1行)的第一个整数小于等于表示编号为i的雇佣军可以执行的任务数,后面的整数是编号为i的雇佣军可以执行的所有任务的编号,这些整数之间用空格隔开。最后的m行中,每行有四个整数b、e、p和r,彼此之间用空格隔开,其中第j行(对应整个文件的第n+j+1行)是编号为j的任务的描述:0 〈 b 〈 32表示该任务的开始日(这一天会被计入任务所需的时间中),0 < e〈32表示该任务的结束日(这一天也会被计入任务所需的时间中),p 〈 10表示该任务所需人数,0 〈 r 〈 100000表示该任务的报酬。
Output
第一行只有一个整数t,表示最多可获得的总报酬,
Sample Input
3 5
2 1 4
2 2 4
3 3 4 5
2 20 1 100
1 18 1 200
3 28 1 800
21 30 3 1500
19 21 1 400
Sample Output
1800
竟然是真的,爆搜就可以AC了
不敢想象,为什么要这么出水题,我还以为有什么算法在里面呢

1 var 2 n,m,ans:longint; 3 flag:array[0..10,0..15]of boolean; 4 time:array[0..10]of longint; 5 s,t,p,v:array[0..15]of longint; 6 a:array[0..10,0..1024]of longint; 7 8 procedure swap(x,y:longint); 9 var 10 i,ti:longint; 11 ss:boolean; 12 begin 13 for i:=1 to n do 14 begin 15 ss:=flag[i,x]; 16 flag[i,x]:=flag[i,y]; 17 flag[i,y]:=ss; 18 end; 19 ti:=s[x];s[x]:=s[y];s[y]:=ti; 20 ti:=t[x];t[x]:=t[y];t[y]:=ti; 21 ti:=p[x];p[x]:=p[y];p[y]:=ti; 22 ti:=v[x];v[x]:=v[y];v[y]:=ti; 23 end; 24 25 procedure init; 26 var 27 i,j,k,x:longint; 28 begin 29 read(n,m); 30 for i:=1 to n do 31 begin 32 read(k); 33 for j:=1 to k do 34 begin 35 read(x); 36 flag[i,x]:=true; 37 end; 38 end; 39 for i:=1 to m do 40 read(s[i],t[i],p[i],v[i]); 41 for i:=1 to 1<<n-1 do 42 begin 43 k:=0; 44 for j:=1 to n do 45 if i and (1<<(j-1))>0 then inc(k); 46 inc(a[k,0]); 47 a[k,a[k,0]]:=i; 48 end; 49 for i:=m-1 downto 1 do 50 for j:=1 to i do 51 if s[j]>s[j+1] then swap(j,j+1); 52 end; 53 54 procedure dfs(x,y:longint); 55 var 56 i,j:longint; 57 save:array[0..10]of longint; 58 can:boolean; 59 begin 60 if x>m then 61 begin 62 if y>ans then ans:=y; 63 exit; 64 end; 65 dfs(x+1,y); 66 save:=time; 67 for i:=1 to a[p[x],0] do 68 begin 69 can:=true; 70 for j:=1 to n do 71 if a[p[x],i] and (1<<(j-1))>0 then 72 begin 73 if (flag[j,x])and(time[j]<s[x]) then time[j]:=t[x] 74 else 75 begin 76 can:=false; 77 break; 78 end; 79 end; 80 if can then dfs(x+1,y+v[x]); 81 time:=save; 82 end; 83 end; 84 85 begin 86 init; 87 dfs(1,0); 88 write(ans); 89 end.