出装方案 “东信杯”广西大学第一届程序设计竞赛(同步赛)

链接:https://ac.nowcoder.com/acm/contest/283/F
来源:牛客网
 

题解:二进制状态压缩

代码

#include<bits/stdc++.h>
using namespace std;

#define INF 0x3f3f3f3f
const int maxn=1e5+100;
const double eps=1e-10;
const long long mod=1e9+7;

typedef long long ll;
typedef unsigned long long ull;

int ma[20][20];
int dp[1<<16];

void sov(int n) {
    memset(dp,0,sizeof(dp));
    int mx=(1<<n)-1;
    for(int i=1;i<=n;++i) {
        for(int j=0;j<=mx;++j) {
            int cnt=0;
            for(int k=0;k<n;++k) {
                if(j&(1<<k)) cnt++;
            }
            if(cnt==i-1) {
                for(int k=0;k<n;++k) {
                    if(j&(1<<k)) continue;
                    dp[j|(1<<k)]=max(dp[j|(1<<k)],dp[j]+ma[k+1][i]);
                }
            }
        }
    }
    cout << dp[mx] << endl;
}

int main() {
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
                cin>>ma[i][j];
        }
        sov(n);
    }
    return 0;
}

题目描述

众所周知,在各种对抗类游戏里装备都是很重要的一环,不同的出装方案会给玩家带来不同的强度。

dalao手里有N件装备,现在dalao要把装备分给N个队友,每个队友只能分一件装备,而每个队友穿上不同的装备会有不同程度的强度提升。

现在给出每个队友对每件装备的强度提升的值,请问dalao的所有分配方案里,最多能让团队的强度提升多少呢?

输入描述:


 

第一行有一个整数T,表示数据的组数(不会超过150组)

每组数据第一行包含一个整数N,接下来会有N行,每行有N个整数,其中第 a 行的第 b 个数字表示第 a 个队友穿上第 b 件装备的强度提升。任何队员穿任何装备的强度提升都不会超过20000。

 

输出描述:

对于每组数据在一行内输出一个整数表示强度能够提升的最大值

示例1

输入

复制

2
4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
3
1 3 5
2 4 6
7 9 11

输出

复制

34
16
posted @ 2018-11-26 21:03  UUUUh  阅读(269)  评论(0编辑  收藏  举报