首页 > 其他 > 详细

zoj3471 Most Powerful

时间:2020-09-12 18:53:28      阅读:41      评论:0      收藏:0      [点我收藏+]

题目链接: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;
}

  

 

zoj3471 Most Powerful

原文:https://www.cnblogs.com/edmunds/p/13657906.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!