全部评论 1

  • 
    
    
    
    #include <bits/stdc++.h>
    #define LL long long
    
    using namespace std;
    
    const int maxn = 56, maxk = 105, maxm = 2e3 + 5, INF = 1e9 + 7;
    char read_ch() {
        char ch = getchar();
        while (ch != 'A' && ch != 'B') ch = getchar();
        return ch;
    }
    struct Edge {
        int v, nex; LL w;
        Edge(int v = 0, LL w = 0, int nex = 0) : v(v), w(w), nex(nex) {}
    } E[maxn << 1];
    int hd[maxn], tote;
    
    void addedge(int u, int v, LL w) {
        E[++tote] = Edge(v, w, hd[u]), hd[u] = tote;
    }
    
    int N, M, hsf[maxn];
    LL cst[maxn], lim[maxn], v[maxn], f[maxn][maxk][maxm], g[maxm], ans;
    
    void dfs(int u) {
        if (!u) { 
            for (int i = hd[u]; i; i = E[i].nex) {
                dfs(E[i].v);
                for (int j = M; j >= 0; j--)
                    for (int k = 0; k <= j; k++)
                        f[u][0][j] = max(f[u][0][j], f[u][0][j - k] + f[E[i].v][0][k]);
            }
            return ;
        } 
        if (!hd[u]) { 
            lim[u] = min(lim[u], M / cst[u]);
            for (int i = lim[u]; i >= 0; i--)
                for (int j = i; j <= lim[u]; j++)
                    f[u][i][j * cst[u]] = (j - i) * v[u];
            return ;
        }
        lim[u] = INF;
        for (int i = hd[u]; i; i = E[i].nex) {
            int v = E[i].v;
            dfs(v);
            lim[u] = min(lim[u], lim[v] / E[i].w), cst[u] += cst[v] * E[i].w;
        }
        lim[u] = min(lim[u], M / cst[u]);
        for (int j = 0; j <= lim[u]; j++) {
            for (int i = 0; i <= M; i++) g[i] = -INF;
            g[0] = 0;
            for (int i = hd[u]; i; i = E[i].nex) {
                int v = E[i].v;
                for (int x = M; x >= 0; x--) {
                    LL newgx = -INF;
                    for (int y = 0; y <= x; y++)
                        newgx = max(newgx, g[x - y] + f[v][j * E[i].w][y]);
    

    1周前 来自 浙江

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页