求助站外题
  • 板块学术版
  • 楼主Addicted_Game
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/1/24 14:59
  • 上次更新2024/1/24 17:02:12
查看原帖
求助站外题
939931
Addicted_Game楼主2024/1/24 14:59
题面

通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接。但是每个房间里都有特别的保护魔法,在它的作用下,我无法通过这个房间,也无法取得其中的钥匙。虽然我可以通过消耗能量来破坏房间里的魔法,但是我的能量是有限的。那么,如果我最先站在1号房间(1号房间的保护魔法依然是有效的,也就是,如果不耗费能量,我无法通过1号房间,也无法取得房间中的钥匙),如果我拥有的能量为P,我最多能取得多少钥匙?

code
#include<bits/stdc++.h>
using namespace std;
int n,p;
struct node{
	int l,r;
}a[105];
int rt;
int w[105],c[105];//钥匙数 消耗 
int dp[105][105];
//int sn[105],sc[105];//子树钥匙总数 子树消耗总数 
void dfs(int x,int y){
	if(dp[x][y]) return ;
//	if(a[x].l) dfs(a[x].l);
//	if(a[x].r) dfs(a[x].r);
	for(int k=0;k<=y-c[x];k++){
	//做法一 
		if(a[x].l) dfs(a[x].l,k);
		if(a[x].r){
			dfs(a[x].r,y-k-c[x]);
			dfs(a[x].r,y);
		}
		dp[x][y]=max(dp[x][y],max(dp[a[x].l][k]+dp[a[x].r][y-k-c[x]]+w[x],dp[a[x].r][y]));
	//做法二 
//		dp[x][k]=dp[a[x].r][k];
//		for(int i=0;i<=k-c[x];i++){
//			dp[x][k]=max(dp[x][k],dp[a[x].l][i]+dp[a[x].r][k-i-c[x]]+w[x]);
//		}
	}
/*
	//for(int k=1;k<=m+1&&k<=sn[x];k++){//枚举子树名额 
	//	dp[x][k]=dp[a[x].r][k];//跟兄弟顺承 
	//	for(int i=max(1,k-sn[a[x].r]);i<=k&&i<=sn[a[x].l]+1;i++){
	//		dp[x][k]=max(dp[x][k],dp[a[x].l][i-1]+dp[a[x].r][k-i]+w[x]);//找最大 
	//	}
	//}
*/
}
void add(int x,int y){
	a[y].r=a[x].l;
	a[x].l=y;
}
//bool prt[105];
int main(){
	scanf("%d%d",&n,&p);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&c[i],&w[i]);
	}
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		//prt[y]=true;
	}
	dfs(1,p);
	printf("%d",dp[1][p]);
	return 0;
}////多叉树 消耗cx单位获得kx价值 出始在p 求最大价值
//dp[i][j]表示在 使用j单位在i的最大价值 
//dp[i][j]=max(dp[a[x].l][k]+dp[a[x].r][q-k-c[x]]+w[x]) //枚举q,k q为现有能量 k为分配给左子树使用能量 

一直WA,20分

2024/1/24 14:59
加载中...