题目链接:
https://vjudge.net/contest/159644#problem/F
题意:
研究人员发现有N个原子两两组合会发生反应产生能量,且其中一个会被和谐掉,给出一个矩阵map,其中map[i][j]表示原子i与j发生反应且原子j被和谐掉所释放的能量,问给定的n个原子反应最多能产生多少能量。
题解:
dp[sta]:=第i位为1表示第i个原子被和谐了,所得到的最大能量
则最后的答案就是 枚举每一位没被消灭的最大值
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 1e5+10; 17 18 int a[15][15]; 19 int dp[(1<<11)]; 20 21 int main(){ 22 int n; 23 while(cin>>n && n){ 24 for(int i=0; i<n; i++) 25 for(int j=0; j<n; j++) 26 a[i][j] = read(); 27 MS(dp); 28 for(int s=0; s<(1<<n); s++){ 29 for(int i=0; i<n; i++){ 30 if(s&(1<<i)) continue; 31 for(int j=0; j<n; j++){ 32 if((s&(1<<j)) || i==j) continue; 33 dp[s|(1<<j)] = max(dp[s|(1<<j)],dp[s]+a[i][j]); 34 } 35 } 36 } 37 int ans = 0; 38 for(int i=0; i<n; i++) 39 ans = max(ans,dp[((1<<n)-1)^(1<<i)]); 40 cout << ans << endl; 41 } 42 43 return 0; 44 }