枚举了所有状态 1800+ms过了......

1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 7 using namespace std; 8 9 int c[25][25]; 10 11 int MaxSum; 12 13 bool MarkSubSet[25]; 14 15 void dfs(int cur,int ans,int Sum,int n) 16 { 17 if(cur > n) 18 { 19 int i,j,sum; 20 for(i = 1,sum = 0; i <= n; ++i) 21 { 22 if(MarkSubSet[i]) 23 { 24 for(j = 1; j <= n; ++j) 25 { 26 if(MarkSubSet[j] == false) 27 sum += c[i][j]; 28 } 29 } 30 } 31 MaxSum = MaxSum > sum ? MaxSum : sum ; 32 return ; 33 } 34 MarkSubSet[cur] = true; 35 dfs(cur+1,ans+1,Sum,n); 36 MarkSubSet[cur] = false; 37 dfs(cur+1,ans,Sum,n); 38 } 39 40 int main() 41 { 42 43 int n,i,j; 44 while(scanf("%d",&n) != EOF) 45 { 46 47 for(i = 1; i <= n; ++i) 48 { 49 for(j = 1; j <= n; ++j) 50 scanf("%d",&c[i][j]); 51 } 52 53 MaxSum = -1; 54 memset(MarkSubSet,false,sizeof(MarkSubSet)); 55 56 dfs(1,0,n/2,n); 57 58 printf("%d ",MaxSum); 59 } 60 return 0; 61 }