链接: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