直接用优先队列bfs+set判重水过,需要注意的是,因为m<=100,所以用short就可以不超内存了= =!

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<set>
 6 using namespace std;
 7 int ar[105][2005],n,m;
 8 struct data
 9 {
10     short p[105];
11     int sum;
12     bool operator<(const data &ne)const
13     {
14         if(sum!=ne.sum)
15             return sum>ne.sum;
16         else
17         {
18             for(int i=0;i<m;i++)
19             {
20                 if(p[i]!=ne.p[i])
21                     return p[i]>ne.p[i];
22             }
23             return false;
24         }
25     }
26 };
27 priority_queue<data> Q;
28 set<data> ss;
29 int main()
30 {
31     int T;
32     for(scanf("%d",&T);T;T--)
33     {
34         scanf("%d%d",&m,&n);
35         for(int i=0;i<m;i++)
36         {
37             for(int j=0;j<n;j++)
38                 scanf("%d",&ar[i][j]);
39             sort(ar[i],ar[i]+n);
40         }
41         data a;
42         while(!Q.empty())
43             Q.pop();
44         memset(a.p,0,sizeof(a.p));
45         a.sum=0;
46         for(int i=0;i<m;i++)
47             a.sum+=ar[i][0];
48         Q.push(a);
49         ss.clear();
50         for(int i=0;i<n;i++)
51         {
52             a=Q.top();
53             Q.pop();
54             if(ss.find(a)!=ss.end())
55             {
56                 i--;
57                 continue;
58             }
59             ss.insert(a);
60             if(i)
61                 printf(" ");
62             printf("%d",a.sum);
63             for(int j=0;j<m;j++)
64             {
65                 a.p[j]++;
66                 a.sum+=ar[j][a.p[j]]-ar[j][a.p[j]-1];
67                 Q.push(a);
68                 a.sum-=ar[j][a.p[j]]-ar[j][a.p[j]-1];
69                 a.p[j]--;
70             }
71         }
72         printf("\n");
73     }
74     return 0;
75 }