只有10分,WA了9个点,求助大佬!!!!
查看原帖
只有10分,WA了9个点,求助大佬!!!!
104308
Capitalism_Gao楼主2020/7/29 10:03
#include<bits/stdc++.h>
#define max(a,b) a>b?a:b
using namespace std;

const int maxn=3e3+5,maxcost=2e4+5;
int n,m,cnt,maxc;
int head[maxn],path[maxn],f[maxn][maxcost],bag[maxn][maxn];
struct node{
	int next,to,cost;
}e[maxn];

inline void adde(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].cost=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}

void bfs(int now,int len){
	path[now]=len;
//	printf("path[%d]=%d\n",now,path[now]);
	for(int i=head[now];i;i=e[i].next){
		int v=e[i].to;
		bfs(v,len+e[i].cost);
	}
}

inline bool is_human(int u){
	if(u<=n-m&&u>=1) return false;
	return true;
} 

void work(int now,int tot){
	for(int i=head[now];i;i=e[i].next){
		int v=e[i].to;
		if(is_human(v)){
			bag[now][++tot]=e[i].cost;
			continue;
		}
		work(v,0);
//		printf("work(%d,%d): ",now,v);
		int dis=path[v]-path[now];
		for(int j=maxc-dis;j>=0;j--){
			f[now][j+dis]=max(f[now][j+dis],f[v][j]);
//			printf("f[%d][%d]=%d\n",now,j+dis,f[now][j+dis]);
		}
	}
//	printf("bag(%d): ",now);
	for(int i=1;i<=tot;i++){
		for(int j=maxc;j>=bag[now][i];j--){
			f[now][j]=max(f[now][j],f[now][j-bag[now][i]]+1);
//			printf("f[%d][%d]=%d\n",now,j,f[now][j]);
		}
	}
}

int main(){
//	freopen("output.txt","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n-m;i++){
		int k;
		scanf("%d",&k);
		for(int j=1;j<=k;j++){
			int v,w;
			scanf("%d%d",&v,&w);
			adde(i,v,w);
		}	
	}
	for(int i=1;i<=m;i++){
		int w;
		scanf("%d",&w);
		maxc+=w;
	}
	bfs(1,0);
	work(1,0);
	printf("%d",f[1][maxc]);
//	for(int j=1;j<=maxc;j++){
//		printf("f[1][%d]=%d\n",j,f[1][j]);
//	}
//	printf("%d",maxc);
	
	return 0;
}
2020/7/29 10:03
加载中...