问题 B: Little bear 的情人节
时间限制: 1 Sec 内存限制: 128 MB提交: 52 解决: 9
[ 提交][ 状态][ 讨论版]
题目描述
Little bear本来妄想着会有个幸福的七夕节,可是强大的黑暗魔法师Sjhshuan给Little bear施了一个狠毒的魔法。
Little bear再也见不到他的Love bear,除非他能够帮助伟大的黑暗魔法师Sjhshuan完成一些任务。
现在Little bear非常伤心,他想请各位高富帅的程序猿GG && 白富美的程序媛MM们帮帮忙!!
Sjhshuan要Little bear帮助他把魔法药剂最大威力组合的给找出来。
Sjhshuan有N种魔法药剂,但是我们最多只能选取其中的K(K <= N)种魔法药剂来进行组合(至少取2种)。
输入
有T组测试数据;
每组数据第一行有一个N(2 <= N <= 15)和一个K( 2 <= K <= 15);
接着跟着N行,每行有N个整数Aij(-100 <= Aij <= 100) 表示第i种药剂和第j种药剂在一起产生的威力;
保证Aij = Aji,Aii =0。
输出
输出最后的答案。
样例输入
22 20 11 03 30 1 21 0 22 2 0
样例输出
15
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define CLR(Arr,val) memset(Arr,val,sizeof Arr)
#define FOR(i,s,e) for(int i=s;i<=e;i++)
int Map[20][20];
int save[20];
const int INF = 100000000;
int main()
{
int T,N,K;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&N,&K);
FOR(i,1,N)
{
FOR(j,1,N)
{
scanf("%d",&Map[i][j]);
}
}
int ans = -INF;
FOR(i,1,(1 << N) - 1)//枚举1———111111111111N个1,1表示拿,0表示不拿
{
int cnt = 0;
FOR(j,0,N-1)//把这个数的二进制数为1的取出来表示取了
{
if(i & (1 << j))
save[cnt++] = j + 1;
}
if(cnt > K && cnt < 2)
continue;
int sum = 0;
int flag = 0;
FOR(j,0,cnt - 1)
{
FOR(k,j+1,cnt - 1)
{
sum += Map[save[j]][save[k]];
flag = 1;
}
}
if(flag)
ans = max(ans,sum);
}
cout << ans << endl;
}
return 0;
}