zoj3471_状压dp
链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=50137#problem/C
题意:有n种化学物质,他们彼此反应会有一种消失并释放出能量。
给出矩阵,第i行j列代表i和j反应j消失释放的能量。
求最大释放多少能量。
思路:
利用二进制0代表该物质还存在,1代表不存在。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int N = 1 << 10; 7 int a[12][12], dp[N]; 8 int main() 9 { 10 int n; 11 while(~scanf("%d", &n) && n) 12 { 13 for(int i = 1; i <= n; i++) 14 for(int j = 1; j <= n; j++) 15 scanf("%d", &a[i][j]); 16 memset(dp, 0, sizeof(dp)); 17 int mm = 0; 18 for(int i = 0; i < (1 << n); i++)//利用二进制0代表该物质还存在,1代表不存在。 19 { 20 for(int j = 1; j <= n; j++) 21 { 22 if(i & (1 << (j - 1)))//在剩下的物质里找没有发生反应的 23 continue; 24 for(int k = 1; k <= n; k++) 25 { 26 if(i & (1 << (k - 1))) 27 continue; 28 if(j == k) 29 continue; 30 int next = (i | (1 << (j - 1))); 31 dp[next] = max(dp[next], dp[i] + a[k][j]); 32 mm = max(dp[next], mm); 33 } 34 } 35 } 36 printf("%d\n", mm); 37 } 38 return 0; 39 }