题目链接: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;
}