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

每个节点的容量定义为这个节点下的叶子结点个数,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. react 的生命周期函数

    生命周期函数: 是指在某一时刻组件自动执行 的函数 初始化: 设置props和state mounting: componentWillMount 在组件即将被挂载到页面的时候自动执行 render ...

  2. vue Inline JavaScript is not enabled. Is it set in your options?

    Vue 全家桶 vue全面介绍--全家桶.项目实例 https://www.cnblogs.com/nogodie/p/9853660.html vue项目 Inline JavaScript is ...

  3. vue 学习八 自定义指令

    vue指令注册有两种方式 1 全局注册 在main.js中 使用vue.directive Vue.directive('alert_w', { inserted(el,bin,vn) { conso ...

  4. lombok 注解简单介绍

    一.Lombok 的简单介绍和使用 Lombok是一个可以帮助我们简化 Java 代码编写的工具类,通过采用注解的方式简化了 JavaBean 的编写,使我们写的类更加简洁. 1. 添加 Lombok ...

  5. Java中几种排序算法

    1.冒泡排序算法 通过多次比较(相邻两个数)和交换来实现排序 public class bubble { public static void bubbleSort(int[] a) { int te ...

  6. nc临时开启端口并监听

    port="6379 3306 27017 4505 4506 24007 24008 49152" #while true #do for i in $port do isexi ...

  7. PHP ftp_login() 函数

    定义和用法 ftp_login() 函数登录 FTP 服务器. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE 和一个警告. 语法 ftp_login(ftp_connection,us ...

  8. delphi 文件的操作:重命名、复制、移动、删除

    Delphi 文件的操作:重命名.复制.移动.删除第一种方法: RenameFile('Oldname', 'Newname'); CopyFile(PChar('Oldname'), PChar(' ...

  9. DNS排查技术图谱

    # DNS排查技术图谱 ## 应用程序视角- 应用程序 - 浏览器 - hostname cache - ping- 操作系统 - hostname cache - 域名解析器 - dig domai ...

  10. vscode 编写Python走过的坑

    1,在使用vscode 中import turtle 这个模块, 再调用t = turtle.Pen(),始终提示无法找到turtle模块 2.可是使用terminal 中调用turtle模块,没有问 ...