1 条题解
-
0
#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
- 上传者