zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    
  • 相关阅读:
    h5-7
    h5-6
    h5-5
    h5-4
    h5-3
    h5-2
    return
    字符串的常用操作
    字符串中的转义字符
    字典的统计,合并,清空操作
  • 原文地址:https://www.cnblogs.com/quanjun/p/15680485.html
Copyright © 2011-2022 走看看