JZOJ5344 摘果子

Description
Input
Output
Sample Input
7 9
39 6
13 2
22 6
7 4
-19 5
28 6
-17 1
2 1
3 2
4 1
5 4
6 2
7 3
Sample Output
52
Data Constraint

Summary

  这道题的模型是有依赖树形背包问题

  我们把树的 dfs 序建出来,对于 dfs 序上每一个点,我们考虑如果自己选那么自己子树内就 可以选,否则只有在这棵子树外面才可以选。

  设 f[i][j]表示 dfs 序第 i 个点及以后,费用总和为 j 的最大价值那么可以分第 i 个点选或不选进行转移

  选:f[i][j]=max(f[i+1][j-w]+v)

  不选:f[i][j]=max(f[i+size[x]][j]),其中 x 表示 dfs 序为 i 的那个点。

  

 1 #include<cstdio>
 2 #define N 2018
 3 using namespace std;
 4 struct arr{
 5     int x,y,next;
 6 }s[N*3];
 7 int n,m,ans,l,v[N],p[N],ls[N],a[N],f[N][N],size[N];
 8 bool c[N];
 9 int ss(int x)
10 {
11     int i=ls[x];
12     a[++l]=x; 
13     while (i!=0){
14         if (c[s[i].y]){
15             c[s[i].y]=false;
16             ss(s[i].y);
17             size[x]+=size[s[i].y];
18         }
19         i=s[i].next;
20     }
21     size[x]++;
22 }
23 
24 int max(int a,int b){
25     if (a>b) return a;
26     return b;
27 }
28 
29 int main(){
30     scanf("%d%d",&n,&m);
31     for(int i=1;i<=n;i++)
32         scanf("%d%d",&v[i],&p[i]);
33     for(int i=1;i<n;i++){
34          scanf("%d%d",&s[i*2-1].x,&s[i*2-1].y);
35         s[i*2-1].next=ls[s[i*2-1].x];
36         ls[s[i*2-1].x]=i*2-1;
37         s[i*2].x=s[i*2-1].y;
38         s[i*2].y=s[i*2-1].x;
39         s[i*2].next=ls[s[i*2].x];
40         ls[s[i*2].x]=i*2;
41     }
42     for(int i=2;i<=n;i++) c[i]=true;
43     ss(1);
44     for(int i=0;i<=n+1;i++)
45         for(int j=0;j<=m;j++)
46             f[i][j]=-0xffffff;
47     f[1][0]=0;
48     for(int i=1;i<=n;i++){
49         for(int j=0;j<=m;j++){
50             if(j+p[a[i]]<=m){
51                 f[i+1][j+p[a[i]]]=max(f[i+1][j+p[a[i]]],f[i][j]+v[a[i]]);
52                 f[i+size[a[i]]][j+p[a[i]]]=max(f[i+size[a[i]]][j+p[a[i]]],f[i][j]+v[a[i]]);    
53             }
54             f[i+size[a[i]]][j]=max(f[i+size[a[i]]][j],f[i][j]);
55         }
56     }
57     int ans=0;
58     for(int j=0;j<=m;j++)
59         ans=max(ans,f[n+1][j]);
60     printf("%d",ans);
61 }
View Code

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9630575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值