社区讨论
站外题求助
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...