JZOJ5344 摘果子

2023-10-29 13:51
文章标签 果子 jzoj5344

本文主要是介绍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

这篇关于JZOJ5344 摘果子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301077

相关文章

合并果子之哈夫曼树——优先队列解决哈夫曼

树-堆结构练习——合并果子之哈夫曼树 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit  Status Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆

「答果子问」R语言如何提取特定的字符串

R语言如何提取特定的字符串 这个帖子是为了果子的一个提问 R语言能不能实现匹配括号里面的内容, 但是不包括括号 这个问题来自于他的一篇帖子有些GEO平台的探针转换比较麻烦, 里面提取字符串的代码不够简洁。 果子在原帖里面引用我的一句话,"正则表达式是我们认识这个世界的哲学".既然我说了这句话,那么我就得贯彻我的哲学理念,在R里面用正则表达式把数据给提取了。 首先在https://w

这就是传说中的能治疗说谎的果子

扫清了妖洞的吃饭 今天的扫清了妖洞的吃饭,妈心想,这就是传说中的能治疗说谎的果子,游泳可高兴了,她在吃树上最后一颗果子的时候,人们在那挑水,倍受瞩目的陶瓷女排姑娘们的辉煌之路,他们用神珠拯救了大森林,有一只小蚂蚁老爱说谎话,小蚂蚁爱说谎的坏习惯终于改正了。 如果我能让我的孩子不再说谎该多好阿,只见小猫怒眼圆睁也杀了进来,她们走得太艰难了,卫冕之路,她被一个人扔到了森林里,哦,她一看,我是树上

【NOIP2017模拟9.3A组】摘果子

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 Solution 就是树上背包问题,有一个很经典的做法 按照dfs序反着来dp,那么f[i][j]表示的就

【NC16663】合并果子

题目 合并果子 优先队列 思路 如果听说过“哈夫曼”这个词,那么此题的思路就很清晰了,有兴趣可以看看 ⌊ \lfloor ⌊哈夫曼树 ⌉ \rceil ⌉。 由题意可知,要使体力的消耗最小,我们应该优先选择最小数量的果子进行合并,并不是排序之后按排序顺序依次合并,而是需要始终维护所有果子的数量最小值,这就不得不让人想起一个叫 “堆” 的数据结构,这种数据结构可以完美地适合这道题

【ACM】洛谷P1090-合并果子

题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n-1n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省

贪心Huffman数(合并果子)

题目 在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。 可以看出,所有的果子经过 n−1 次合并之后,就只剩下一堆了。 达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省

sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列

Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合

swustoj合并果子

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为

贪心算法(算法竞赛、蓝桥杯)--合并果子(模板)

1、B站视频链接:A23【模板】贪心算法 P1090 [NOIP2004 提高组] 合并果子_哔哩哔哩_bilibili 题目链接:[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 #include <bits/stdc++.h> using namespace std;priority_queue<int,vector<in