dp函数的最内层循环,k的范围为什么是到j而不是min(j, sz[y]), 当k>sz[y]的时候,dp数组没有意义呀
但是这样写能过,改了之后过不了
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e3 + 10;
int n, m;
int h[N], ne[N], e[N], w[N], idx;
int sz[N];
int f[N][N];
int t[N];
void add(int a, int b, int c)
{
w[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dp(int u)
{
for (int i = h[u]; ~i; i = ne[i])
{
int y = e[i];
dp(y); sz[u] += sz[y] + 1;
for (int j = sz[u]; j; j -- )
for (int k = 0; k <= j; k ++ )
f[u][j] = max(f[u][j], f[u][j - k] + f[y][k] - w[i]);
}
}
int main()
{
scanf("%d%d", &n, &m);
memset(f, 0xcf, sizeof f);
memset(h, -1, sizeof h);
for (int i = 1; i <= n - m; i ++ )
{
int k;
scanf("%d", &k);
for (int j = 1; j <= k; j ++ )
{
int a, c;
scanf("%d%d", &a, &c);
add(i, a, c);
}
}
for (int i = n - m + 1; i <= n; i ++ )
scanf("%d", &f[i][1]);
for (int i = 1; i <= n; i ++ )
f[i][0] = 0;
dp(1);
for (int i = m; i; i -- )
if (f[1][i] >= 0)
{
cout << i << endl;
break;
}
return 0;
}