题目链接: 题目链接
题目分析 :
我们用0来表示这个气球存在,1表示这个气球不存在,我们遍历(1<<n)-1种状态,枚举每一个状态中存在的气球i,在枚举存在的气球j,我们可以推出i存在j不存在的状态,刷表法就可以了,d[S|(1<<(j-1))]=max(d[S]+val[i][j],d[S|(1<<(j-1)]);
#include<cstdio>
#include<cstdlib>
#include<cstring>
int val[15][15],d[1<<17],n;
using namespace std;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
memset(val,0,sizeof(val));
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&val[i][j]);
}
}
for(int S=0;S<=(1<<n)-1;S++)
for(int i=1;i<=n;i++)
{
if((S&(1<<(i-1)))) continue ;
else
{
for(int j=1;j<=n;j++)
{
if(i==j) continue ;
if((S&(1<<(j-1)))) continue ;
d[S|(1<<(j-1))]=max(d[S]+val[i][j],d[S|(1<<(j-1))]);
}
}
}
}
int ans=0;
for(int S=0;S<=(1<<n)-1;S++)
{
ans=max(ans,d[S]);
}
printf("%d\n",ans);
return 0;
}