求助,样例过不去
查看原帖
求助,样例过不去
985711
NightDiver楼主2023/10/17 12:04
#include <bits/stdc++.h>

const int N = 3e3 + 5;

using namespace std;

int n , m;

struct edge {
	int to , nxt , w;
};
edge e[N];

int cnt = 0 , head[N];
void add(int u , int v , int w){
	e[ ++ cnt].to = v;
	e[cnt].w = w;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}

int f[N][N] , num[N];
int dfs(int u){
	if(u <= n && u > n - m){
		return num[u] = 1;
	}
	for(int i = head[u];i != 0;i = e[i].nxt){
		int v = e[i].to , w = e[i].w;
		num[u] += dfs(v);
		for(int siz = num[u];siz >= 0; -- siz){
			for(int j = 0;j <= num[v]; ++ j){
				f[u][siz] = max(f[u][siz] , f[v][j] + f[u][siz - j] - w);
			}
		}
	}
	return num[u];
}

int main(){
	for(int i = 0;i <= n; ++ i)f[i][0] = 0;
	cin >> n >> m;
	for(int i = 1;i <= n; ++ i){
		for(int j = 1;j <= m; ++ j){
			f[i][j] = -2147483646;
		}
	}
	for(int u = 1 , v , w , k;u <= n - m; ++ u){
		cin >> k;
		for(int j = 1;j <= k; ++ j){
			cin >> v >> w;
			add(u , v , w);
		}
	}
	for(int i = n - m + 1;i <= n; ++ i){
		cin >> f[i][1];
	}
	
	dfs(1);
	for(int siz = m;siz >= 0; -- siz){
		if(f[1][siz] >= 0){
			cout << siz << endl;
			return 0;
		}
	}
	
}
2023/10/17 12:04
加载中...