http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471
位运算的确很神的说。。。
我这里用1代表爆了,0代表没爆,用二进制记录每种状态,废话少说,上代码。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define LL long long
#define pi acos(-1)
#define N 1<<20+10
#define INF 999999999
#define eps 1e-8
//****************************************
//Author: leolin
//****************************************
int m[15][15];
int dp[(1<<10)+10];
int main()
{
int n;
while(scanf("%d",&n) && n)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&m[i][j]);
int M=1<<n;
for(i=0;i<M;i++)dp[i]=0;
for(k=0;k<M;k++)
{
for(i=0;i<n;i++)
{
if((k&(1<<i))==0)//i is not bao!
for(j=0;j<n;j++)
if(i!=j && (k&(1<<j))==0 )//j is bao!
{
dp[k|(1<<j)]=max( dp[k]+m[i][j],dp[k|(1<<j)]);
}
}
}
int ans=0;
for(i=0;i<M;i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
}
return 0;
}