题目大意就是说给你n种气体,两两之间可以碰撞,从而产生能量,问能够产生的最大能量是多少。。
解法就是用状态压缩。。用0表示没有用过1表示用过了
具体操作看代码。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int map[1005][1005];
int dp[1<<11];
int n;
int MAX(int a,int b)
{
return a>b?a:b;
}
int main()
{
while(~scanf("%d",&n),n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
}
memset(dp,0,sizeof(dp));
int l=1<<n;
for(int i=0;i<l;i++) //枚举所有可能的状态
{
for(int j=0;j<n;j++)
{
if(i&(1<<j)) //判断第j个有没有被用过
continue;
for(int k=0;k<n;k++)
{
if(k==j) //不能与自身碰撞
continue;
if(i&(1<<k)) //第k个气体必须要没有用过
continue;
int news=i|(1<<j);
dp[news]=MAX(dp[news],dp[i]+map[k][j]); //让j与k进行碰撞记录状态
}
}
}
int ans=0;
for(int i=0;i<l;i++) //对每个状态找最大值
ans=MAX(ans,dp[i]);
printf("%d\n",ans);
}
//system("pause");
return 0;
}