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;
    }
    
  • 相关阅读:
    组件之间通信(父传子)
    flex布局
    ffmpeg解析TS流(转)
    swift之?和!的含义(转)
    Swift之画圆角添加多个枚举值方法
    swift之singleton
    swift之闭包
    Swift之fallthrough
    Selector
    Settings Bundle
  • 原文地址:https://www.cnblogs.com/quanjun/p/15680485.html
Copyright © 2011-2022 走看看