标签:
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 10978 | Accepted: 5290 |
Description
Input
Output
Sample Input
3 0 50 30 50 0 40 30 40 0
Sample Output
90
方法1:不是在集合A就是在集合B,一一枚举尝试。
#include <cstdio> #include <cstring> using namespace std; const int MAXN=25; int c[MAXN][MAXN]; int n; int res; int unit[MAXN]; void dfs(int dep) { if(dep==n) { int ans=0; for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(unit[i]!=unit[j]) { ans+=c[i][j]; } if(ans>res) res=ans; return ; } unit[dep]=0; dfs(dep+1); unit[dep]=1; dfs(dep+1); } int main() { while(scanf("%d",&n)!=EOF) { res=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&c[i][j]); dfs(0); printf("%d\n",res); } return 0; }
方法2:参考别人的代码,很巧妙地DFS。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=25; int n; int belong[MAXN]; int c[MAXN][MAXN]; int res; void dfs(int dep,int data) { belong[dep]=1; int tmp=data; for(int i=0;i<n;i++) { if(belong[i]==0) tmp+=c[i][dep]; else tmp-=c[i][dep]; } if(tmp>res) res=tmp; for(int i=dep+1;i<n;i++) { dfs(i,tmp); belong[i]=0; } } int main() { while(scanf("%d",&n)!=EOF) { res=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&c[i][j]); dfs(0,0); printf("%d\n",res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5627648.html