题目描述
Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way every two atoms perform when collided and the power every two atoms can produce.
You are to write a program to make it most powerful, which means that the sum of power produced during all the collides is maximal.
输入描述:
There are multiplecases. The first line of each case has an integer N (2 <= N <= 10), whichmeans there are N atoms: A1, A2, ... , AN.Then N lines follow. There are N integers in each line. The j-th integer on thei-th line is the power produced when Ai and Aj collidewith Aj gone. All integers are positive and not larger than 10000.
The last case isfollowed by a 0 in one line.
There will be no morethan 500 cases including no more than 50 large cases that N is 10.
输出描述:
Output the maximalpower these N atoms can produce in a line for each case.
示例1
输入
2
0 4
1 0
3
0 20 1
12 0 1
1 10 0
0
输出
4
22
代码1:
#include<bits/stdc++.h>
using namespace std;
int maxx(int x,int y)
{
return x>y?x:y;
}
int dp[1<<11];
int main()
{
int n;
int mp[20][20];
while(scanf("%d",&n))
{
if(n==0)
break;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&mp[i][j]);
}
}
int tot=(1<<n);
for(int i=0;i<tot;i++)//枚举可能的状态,0表示存在,1表示消失
{
for(int j=0;j<n;j++)//枚举可能的类型
{
int tmp1=(1<<j);
if((i&tmp1)==0)
{
for(int k=0;k<n;k++)
{
int tmp2=(1<<k);
if((i&tmp2)==0 && j!=k)
dp[i|tmp1]=maxx(dp[i|tmp1],dp[i]+mp[k][j]);//用k去撞击j
}
}
}
}
int ans=-999999999;
for(int i=0;i<tot;i++)
{
if(dp[i]>ans)
ans=dp[i];//最后只剩下原子的组合
}
printf("%d\n",ans);
}
return 0;
}
代码2:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1);
const int MAXN = 100009;
int t, n, mp[12][12], f[1 << 10];
int dfs(int sta, int cnt)
{
//for (int i = 0; i < n; ++i) if ((sta >> i) & 1) cout << i << " ";
//cout << " ppp " << sum << endl;;
if (cnt == 1) return 0;
if (f[sta] != -1) return f[sta];
for (int i = 0; i < n; ++i) {
if ((sta >> i) & 1) {
for (int j = 0; j < n; ++j) {
if (i == j) continue;
if ((sta >> j) & 1) {
int staa = (sta ^ (1 << j));
f[sta] = max(f[sta], dfs(staa, cnt - 1) + mp[i][j]);
}
}
}
}
return f[sta];
}
int main()
{
while (scanf("%d", &n) && n) {
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j) scanf("%d", &mp[i][j]);
memset(f, -1, sizeof(f));
int ans = dfs((1 << n) - 1, n);
printf("%d\n", ans);
}
return 0;
}