most powerful

题目描述 

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值