zoj3471 Most Powerful

题目链接:https://vjudge.net/problem/ZOJ-3471#author=yupengju

题意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量

设f[s]表示最后状态为s时能得到的最大能量(最后的状态一定是某一个位为1,其他都被碰撞过为0)

则有f[s]=max(f[s],f[s']+a[i][j]),这儿s的第i位为1,第j位为0;s'的第j位为1

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int a[15][15],f[(1<<15)],n,i,j,s;

int main(){
	while (cin>>n){
	  if (n==0) break;
	  for (i=0;i<n;i++)
	    for (j=0;j<n;j++) cin>>a[i][j];
	  memset(f,0,sizeof(f));
	  for (s=(1<<n)-1;s>=0;s--) //*
	    for (i=0;i<n;i++)
	      if ((s&(1<<i))) 
	        for (j=0;j<n;j++)
	          if (!(s&(1<<j))) f[s]=max(f[s],f[s^(1<<j)]+a[i][j]);
	  int ans=0;
	  for (i=0;i<n;i++) ans=max(ans,f[1<<i]);
	  cout<<ans<<endl;
	}
	return 0;
}

  

 

posted @ 2020-09-12 18:10  coastal_taipan  阅读(109)  评论(0编辑  收藏  举报