这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可

每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][i],一旦发现是非负数,i则是答案

需要注意的地方:初始化时将所有的dp[i][0]都赋值为0,一个都不选,代价当然是0

        dfs遇到u是叶子结点,那么dp[u][1]定义为这个结点的权值,其余状态用-inf来表示不可达

        其余状态全部赋初始值为-inf,表示目前不可达

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 3005
struct Edge{int to,nxt,w;}e[N<<];
int head[N],tot,n,m;
void add(int u,int v,int w){
e[tot].to=v;e[tot].nxt=head[u];e[tot].w=w;head[u]=tot++;
}
int dp[N][N],a[N],size[N];
void dfs1(int u,int pre){
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
dfs1(v,u);size[u]+=size[v];
}
}
void dfs2(int u,int pre){
if(a[u]){dp[u][]=a[u];return;}
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
dfs2(v,u);
for(int j=size[u];j>=;j--)
for(int k=;k<=size[v];k++)
dp[u][j]=max(dp[u][j],dp[v][k]-e[i].w+dp[u][j-k]);
}
}
int main(){
memset(head,-,sizeof head);
cin>>n>>m;
for(int i=;i<=n-m;i++){
int k,v,w;cin>>k;
while(k--){
cin>>v>>w;
add(i,v,w);add(v,i,w);
}
}
for(int i=n-m+;i<=n;i++)
cin>>a[i],size[i]=;
memset(dp,-0x3f,sizeof dp);
for(int i=;i<=n;i++)dp[i][]=;
dfs1(,);dfs2(,); for(int i=m;i>=;i--)
if(dp[][i]>=){
cout<<i<<endl;
break;
}
}

依赖背包变形(经典)——poj1155的更多相关文章

  1. 依赖背包变形——poj1947(经典)

    /*这题显然不适用依赖背包的优化,因为不能保证根是必选的,但是可以按照常规依赖背包的思路进行转移,即每次对一个儿子进行C^2的转移 还是树形的背包,dp[u][j]表示u的子树里,切割出一个大小为j的 ...

  2. hdu4044 依赖背包变形 好题!

    由于不是求最大的可拦截的HP值,而是要将最小值最大化,那么就需要分配每个子树用的钱数以达到最小值最大化 第一步解决如何分配钱使得结点u的子树中用了j元钱后可以拦截的HP最大,这就是变形的分组(依赖)背 ...

  3. 依赖背包变形——hdu4003

    思维性比较强,代码挺简单的,dp[u][j]表示在u子树下安排j个机器人,让其不回u 注意转移时的初始值 /* dp[u][j]为在子树u有j个机器人不回来 */ #include<bits/s ...

  4. poj1155 依赖背包

    /* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...

  5. J-流浪西邮之寻找火石碎片 【经典背包变形】

    题目来源:2019 ACM ICPC Xi'an University of Posts & Telecommunications School Contest 链接:https://www. ...

  6. FZU 2214 Knapsack problem 01背包变形

    题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...

  7. 依赖背包优化——ural1018,金明的预算方案

    经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的 参考依赖背包优化(泛化物品的并) 根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O ...

  8. 【HDU 4276】The Ghost Blows Light(树形DP,依赖背包)

    The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The t ...

  9. Codeforces Round #214 (Div. 2) C. Dima and Salad (背包变形)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

随机推荐

  1. Aajx调用千千音乐数据接口

    前端展示截图https://images.cnblogs.com/cnblogs_com/LiuFqiang/1429011/o_D09Q55)EL1VFEIJ(GKI%7D%7DY5.png < ...

  2. Python内部变量与外部变量

    def outer(): x = 'outer x' def inner(): x = 'inner x' print(x) inner() print(x) # 这里的`x`与`x = 'outer ...

  3. vue 父到子动态传值 子组件实时渲染

    近期项目中需要一个功能,根据选择不同的 团队片区 id 展示不同的数据,团队id 在父组件  数据在子组件中展示. 根据不同的团队 动态渲染数据总览. 父组件: <Cards ref=" ...

  4. js滚动页面到固定位置进行操作

    $(window).scroll(function () { var scrollTop = $(this).scrollTop(); var scrollHeight = $("#div& ...

  5. 利用Pycharm断点调试Python程序

    利用Pycharm断点调试Python程序 1.代码 准备没有语法错误的Python程序: #!/usr/bin/pythonimport numpy as np class Network: def ...

  6. 正则表达式Pattern类的基本用法

    public void mailRegex() { // 要验证的字符串 String str = "shiruo.hdp@taobao.com"; // 邮箱验证规则 Strin ...

  7. SPSS聚类分析:K均值聚类分析

    SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...

  8. 拾遗:nmcli 连接 wifi

    ... nmcli device wifi list nmcli device wifi connect SSID password PASSWORD ...

  9. 2018 最新 spring boot 整合 swagger2 (swagger2 版本 2.8.0)

    好久没上了, 看到又有人回复了. 我就来修改一下. 修改时间  2018年5月16日 这回给你上全新版本. 至发稿时间,所有的包都是新版. 注意: 高版本需要添加  jaxb-api 包, 否则会报错 ...

  10. 如何用json 与jsonp 的区别去回答你的面试官?

    常常 有面试官这样问我们,虽然用过无数次,但是回答不上岂不是尴尬,那我们浅析一下它们的区别? 1. json JSON是一种基于文本的数据交换格式,用于描述复杂的数据,举个例子: var nax=[ ...