数据不大直接dfs暴搜,但是注意一定要把最大价值初始化成负无穷而非0!!!如果初始化为0在权值全是负数的情况下会错。
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <unordered_map>
#include <unordered_map>
#include <algorithm>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <numeric>
using namespace std;
int t;
int n, k;
int v[20];
int a[20][20];
int ans = -0x3f3f3f3f;
int cnt = 0;
void dfs(int i, int val, vector<int>& prefix) {
if (prefix.size() >= k) {
if (val > ans) {
ans = val;
cnt = 1;
}
else if (val == ans) {
++cnt;
}
}
if (i == n) {
return;
}
for (int j = i; j < n; ++j) {
int teamScore = 0;
for (int p : prefix) {
teamScore += a[j][p];
}
prefix.push_back(j);
dfs(j + 1, val + v[j] + teamScore, prefix);
prefix.pop_back();
}
return;
}
int main() {
cin >> t;
while (t--) {
cin >> n >> k;
ans = -0x3f3f3f3f;
cnt = 0;
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> a[i][j];
}
}
vector<int> buf;
dfs(0, 0, buf);
cout << ans << " " << cnt << endl;
}
return 0;
}