来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257
题意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量。
分析:用10位的二进制中的0、1表示气体是否存在,dp[i]表示i状态时的最大能量。
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
int a[11][11];
int dp[1<<11];
int n;
int main()
{
while(cin>>n,n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
{
if((i&(1<<j)))
continue;
for(int k=0;k<n;k++)
{
if(j==k)
continue;
if((i&(1<<k)))
continue;
int st=i|(1<<k);
dp[st]=max(dp[st],dp[i]+a[j][k]);
//cout<<dp[st]<<endl;
}
}
}
int ans=0;
for(int i=0;i<(1<<n);i++)
ans=max(ans,dp[i]);
cout<<ans<<endl;
}
return 0;
}