1 条题解

  • 0
    @ 2025-5-24 10:28:49
    #include <bits/stdc++.h>
    using namespace std;
    struct Edge
    {
        int v, w;
    };
    vector<Edge> e[3005];
    int n, m;
    int money[3005], mCnt;
    int sz[3005];
    int dp[3005][3005];
    void dfs_dp(int now)
    {
        sz[now] = 0;
        dp[now][0] = 0;
        for (int i = 0; i < e[now].size(); i++)
        {
            int v = e[now][i].v;
            int w = e[now][i].w;
            dfs_dp(v);
            //now 承载多少用户
            for (int j = sz[now]; j >= 0; j--)
                //v 承载多少用户
                for (int k = sz[v]; k >= 0; k--)
                    dp[now][j + k] = min(dp[now][j + k], dp[now][j] + dp[v][k] + w);
            sz[now] += sz[v];
        }
        if (sz[now] == 0)
        {
            sz[now] = 1;
            dp[now][1] = -money[now];
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= n - m; i++)
        {
            int k, v, w;
            cin >> k;
            while (k--)
            {
                cin >> v >> w;
                e[i].push_back((Edge){v, w});
            }
        }
        for (int i = n - m + 1; i <= n; i++)
            cin >> money[i];
        memset(dp, 0x3f, sizeof(dp));
        dfs_dp(1);
        for (int i = m; i >= 0; i--)
        {
            if (dp[1][i] <= 0)
            {
                cout << i << "\n";
                return 0;
            }
        }
        return 0;
    }
    

    信息

    ID
    2086
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    20
    已通过
    12
    上传者