1036: Teamwork Brings Profits!
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 52 Solved: 8
[ Submit][ Status][ Web Board]
Description
Williammed's father is running a small company now, which has N employees.(2<=N<=10 and N is an even number). The employees are numbered from 1 to N. All the employees are divided into N/2 groups. One employee can only be in one group, and each group works on one project. As we all know, teamwork is very important to a company, so different team can make different profits. And now, given any two people i and j, Williammed's father can tell how much profit(Pij) can they make if they work together. Here comes the problem, given all the Pij(1 <= i <= N,1 <= j <= N,0 < Pij<= 100), you should tell the most profits this company can make. This is an easy problem, isn't it?
Input
The first line of the input is N(2<=N<=10 and N is an even number),the number of employees in the company.
Then there're N lines,each line has N numbers.The jth number in the ith line is Pij,as we discribe above.And we guarantee Pij = Pji,Pii = 0.
The end-of-file is denoted by a single line containing the integer 0.
Output
For each case,output the most profits this company can make.
Sample Input
40 6 62 136 0 35 9462 35 0 513 94 5 00
Sample Output
156
HINT
Source
解析:dfs搜出所有组合,选出最大值即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a[12][12];
bool vis[12];
int n, ans;
void dfs(int cnt, int sum){
if(cnt == n){
ans = max(ans, sum);
return ;
}
for(int i=1; i<=n; i++){
if(!vis[i])
for(int j=i+1; j<=n; j++){
if(!vis[j]){
vis[i] = vis[j] = true;
dfs(cnt + 2, sum + a[i][j]);
vis[i] = vis[j] = false;
}
}
}
}
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif // sxk
while(~scanf("%d", &n) && n){
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) scanf("%d", &a[i][j]);
memset(vis, false, sizeof(vis));
ans = 0;
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}