洛谷P5322 [BJOI2019]排兵布阵 题解 分组背包

题目链接:https://www.luogu.com.cn/problem/P5322

解题思路:

分组背包。每个城堡是一个背包。

\(i\) 个城堡在和 \(s\) 个对手打的时候是有最多 \(s\) 种派兵方案的。可以先按照对手派兵人数从小到大排一下序,然后对于第 \(i\) 个对手,对应的物品体积为其派兵人数 \(\times 2 + 1\),价值为城堡编号。因为一个城堡只能派固定的兵,所以该城堡对应的 \(s\) 种方案属于同一个分组。

示例程序:

#include <bits/stdc++.h>
using namespace std;
int s, n, m, f[20020], a, c[110];
vector<int> vec[110];
int main() {
    ios::sync_with_stdio(0);
    cin >> s >> n >> m;
    for (int i = 0; i < s; i ++) {
        for (int j = 1; j <= n; j ++) {
            cin >> a;
            vec[j].push_back(a);
        }
    }
    for (int i = 1; i <= n; i ++) {
        sort(vec[i].begin(), vec[i].end());
        for (int j = m; j > 0; j --) {
            for (int k = 0; k < s; k ++) {
                int c = vec[i][k] * 2 + 1, w = (k+1) * i;
                if (c > j) break;
                f[j] = max(f[j], f[j-c] + w);
            }
        }
    }
    cout << f[m] << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/quanjun/p/15680485.html