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 }

 

posted @ 2016-07-14 13:51  海无泪  阅读(90)  评论(0编辑  收藏  举报