OJ题目:click here~~
题目分析:原子碰撞的时候会产生能量,被碰撞的原子消失,如1碰2,然后2就消失了。。。现有n个原子,给出每个原子与其他原子碰撞时产生的能量值。求所有碰撞之后能产生的能量最大值。
n位二进制位表示某一时刻n个原子的状态。1表示原子已消失,0表示原子还在。注意,最后总会留下一个原子。
AC_CODE
int main(){
int n , i , j ,k, x[11][11] , dp[1<<10];
while(cin >> n && n != 0)
{
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
scanf("%d",&x[i][j]);
memset(dp , -1, (1<<n)*sizeof(int));
dp[0] = 0;
for(i = 0;i <(1<<n);i++)
{
if(dp[i] == -1) continue;
for(j = 0;j < n;j++)
{
if(i&(1<<j)) continue;
for(k = 0;k < n;k++)
{
if(i&(1<<k)) continue;
if(j == k) continue;
dp[i|(1<<k)] = max(dp[i|(1<<k)] , dp[i] + x[j][k]);
}
}
}
cout << *max_element(dp , dp + (1<<n)) << endl;//最后总会留下一个原子
}
return 0 ;
}