比赛组队(百度2017秋招真题)

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 08:39   29   0

题目点我

数据不大直接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;
}
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP