运动员最佳配对问题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int p[100][100];
 5 int q[100][100];
 6 int x[100];
 7 int best[100];
 8 int answer=0;
 9 void swap(int &a,int &b){
10  int temp;
11  temp=a;
12  a=b;
13  b=temp;
14 }
15 void update(){
16 int sum=0;
17 for(int i=1;i<=n;i++){
18     sum+=p[i][x[i]]*q[x[i]][i];
19     }
20     if(sum>answer){
21         answer=sum;
22         for(int i=1;i<=n;i++){
23             best[i]=x[i];
24         }
25     }
26 }
27 void backtrace(int level){
28    if(level>n){
29       update();
30 
31    }
32    else{
33     for(int i=level;i<=n;i++){
34     swap(x[level],x[i]);
35     backtrace(level+1);
36     swap(x[level],x[i]);
37    }
38    }
39 }
40 int main()
41 {
42 
43     cin >> n;
44     memset(p,0,sizeof(p));
45     memset(q,0,sizeof(q));
46     memset(best,0,sizeof(best));
47     memset(x,0,sizeof(x));
48     for(int i=1;i<=n;i++){
49         for(int j=1;j<=n;j++){
50             cin >> p[i][j];
51         }
52     }
53      for(int i=1;i<=n;i++){
54         for(int j=1;j<=n;j++){
55             cin >> q[i][j];
56         }
57     }
58     for(int i=1;i<=n;i++){
59         x[i]=i;
60     }
61     backtrace(1);
62     cout << answer << endl;
63     for(int i=1;i<=n;i++){
64         cout << best[i]<< " ";
65     }
66     return 0;
67 }

猜你喜欢

转载自www.cnblogs.com/henuliulei/p/10188307.html