全WA求助
查看原帖
全WA求助
220824
yyz1005楼主2022/2/16 18:32
#include<bits/stdc++.h>
using namespace std;
const int N = 3010;
int n,m;
struct Edge{
	int from;
	int to;
	int val;
	int next;
} edge[2*N];
int head[N],give[N];
int cnt = 0;
int dp[N][N];
void add(int u,int v,int w){
	cnt++;
	edge[cnt].from = u;
	edge[cnt].to = v;
	edge[cnt].val = w;
	edge[cnt].next = head[u];
	head[u] = cnt;
}
int dfs(int id){
	if(id>n-m){
		dp[id][1] = give[id];
		dp[id][0] = 0;
		return 1;
	}
	dp[id][0] = 0;
	int Size = 0;
	for(int i = head[id]; i; i = edge[i].next){
		int v = edge[i].to;
		int t = dfs(v);//加速 
		Size+=t;
		for(int sum = Size; sum > 0; sum--){
			for(int nowsum = 0; nowsum <= min(sum,t); nowsum++){//这个子树一定有终端 
				dp[id][sum] = max(dp[id][sum],dp[v][nowsum]+dp[id][sum-nowsum]-edge[i].val);
			}
		}
	}
	return Size;
}
int main(){
	memset(dp,0x8f,sizeof(dp));
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n-m; i++){
		int k,a,c;
		scanf("%d",&k);
		while(k--){
			scanf("%d%d",&a,&c);
			add(k,a,c);
		}
	}
	for(int i = n-m+1; i <= n; i++) scanf("%d",&give[i]);
	memset(dp,0,sizeof(dp[0]));
	dfs(1);
	for(int i = m; i >= 0; i--){
		if(dp[1][i]>=0){
			printf("%d",i);
			return 0;
		}
	} 
	return 0;
}
2022/2/16 18:32
加载中...