标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 10391 | Accepted: 4990 |
Description
Input
Output
Sample Input
3 0 50 30 50 0 40 30 40 0
Sample Output
90
题意:将n个数分成两个集合,求一个集合中所有数到另一个集合所有数的最大和
1 #include <iostream> 2 #include <cstring> 3 #include <string.h> 4 #include <algorithm> 5 #include <cstdio> 6 7 using namespace std; 8 const int MAX = 22; 9 int a[MAX][MAX],v[MAX],b[MAX]; 10 int n,cnt,sum; 11 void dfs(int x,int sum) 12 { 13 v[x] = 1; 14 for(int i = 1; i <= n; i++) 15 { 16 if(v[i] == 0) 17 sum += a[x][i]; 18 else 19 sum -= a[x][i]; 20 } 21 cnt = max(cnt,sum); 22 for(int i = x + 1; i <= n; i++) // 这个注意;其实可以这么想,以前求的是路径所以颠倒顺序也是一种情况,这是集合,所以颠倒顺序和原来是一种情况,所以没必要从0开始循环,0,1和1,0是一种情况 23 { 24 dfs(i,sum); 25 v[i] = 0; 26 } 27 } 28 int main() 29 { 30 while(scanf("%d", &n) != EOF) 31 { 32 for(int i = 1; i <= n; i++) 33 { 34 for(int j = 1; j <= n; j++) 35 { 36 scanf("%d", &a[i][j]); 37 } 38 } 39 memset(v,0,sizeof(v)); 40 cnt = 0; 41 dfs(1,0); 42 printf("%d\n",cnt); 43 } 44 return 0; 45 }
POJ2531Network Saboteur(DFS+剪枝)
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/4981914.html