10pts求调
查看原帖
10pts求调
1030785
wangtingmu楼主2024/11/12 23:33
#include<bits/stdc++.h>
using namespace std;
const int maxn=3005;
const int p=-0x7f7f7f;
int n,m;
struct node{
	int num,cost;
};
vector<node >  g[maxn];
int v[maxn],dp[maxn][maxn];
int dfs(int nu,int fa){
	if(g[nu].size()==0) return 1;
	int cnt=0;
	for(int i=0;i<g[nu].size();i++){
		cnt+=dfs(g[nu][i].num,nu);	

	}
	for(int i=0;i<g[nu].size();i++){
		for(int vv=cnt;vv>0;vv--){
			for(int j=0;j<=cnt;j++){
				if(vv-j>=0) dp[nu][vv]=max(dp[nu][vv],dp[nu][vv-j]+dp[g[nu][i].num][j]-g[nu][i].cost);
			}
		}	
	}		

	return cnt;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n-m;i++){
		int k;
		cin>>k;
		for(int i=1;i<=k;i++){
			int x,y;
			cin>>x>>y;
			g[i].push_back((node){x,y});
		}
	}
	memset(dp,-0x7f,sizeof(dp));
	for(int i=n-m+1;i<=n;i++) cin>>v[i];
	for(int i=1;i<=n;i++) dp[i][0]=0;
	for(int i=n-m+1;i<=n;i++) dp[i][1]=v[i];
	dfs(1,-1);
	int ans=-1;
	for(int i=m;i>=1;i--) if(dp[1][i]>=0){
		ans=i;
		break;
	}
	cout<<ans<<endl;
	return 0;
}
2024/11/12 23:33
加载中...