社区讨论

站外题求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhz46hla
此快照首次捕获于
2025/11/15 01:10
3 个月前
此快照最后确认于
2025/11/16 13:43
3 个月前
查看原帖
HDU1011
这题就是在树形背包的基础上加了重量为0的特殊情况,即如果当前背包容量为0,是不可以放入重量为0的点 这题我看网上都是dfs做的,我想能不能有dfs序n*m的解法,但调了很久无果
dfs序代码求调(底部附有数据)
CPP
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int maxn=1e2+10,INF=0x3f3f3f3f;
int n,k,dp[maxn][maxn],mp[maxn],siz[maxn];
int w[maxn],we[maxn],ans,tot;
vector<int> g[maxn];
void dfs(int u,int fa)
{
	siz[u]=1;
	mp[++tot]=u;
	for (auto v:g[u])
	{
		if (v==fa) continue;
		dfs(v,u); 
		siz[u]+=siz[v];
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	while (cin>>n>>k)
	{
		if (n==-1&&k==-1) break;
		ans=tot=0;
		memset(dp,0,sizeof dp);
		for (int i=1;i<=n;i++)
		{
			cin>>we[i]>>w[i];
			we[i]=(we[i]+19)/20;
			g[i].clear();
		}
		for (int i=1,u,v;i<n;i++)
		{
			cin>>u>>v;
			g[u].push_back(v);
			g[v].push_back(u);
		}
		dfs(1,0);
		if (!k)
		{
			cout<<0<<"\n";
			continue;
		}
		for (int i=n;i>=1;i--)
		{
			for (int j=k;j>=0;j--)
			{
				if (j>=we[mp[i]]) dp[i][j+(j==we[mp[i]]?1:0)]=max(dp[i+1][max(1,j-we[mp[i]])]+w[mp[i]],dp[i+siz[mp[i]]][j]);
				else dp[i][j]=dp[i+siz[mp[i]]][j];
			}
		}
		for (int i=1;i<=k;i++) ans=max(ans,dp[1][i]);
		cout<<ans<<"\n";
	}
	return 0;
} 
/*
3 1
0 10
0 20
0 30
1 2
2 3//60
4 1
0 10
0 20
0 30
1 60
1 2
2 3
1 4//70
4 1
0 10
0 30
0 30
1 50
1 2
2 3
1 4//70
-1 -1

*/

回复

0 条回复,欢迎继续交流。

正在加载回复...