依赖背包变形(经典)——poj1155

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

每个节点的容量定义为这个节点下的叶子结点个数,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<<1];
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!=-1;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][1]=a[u];return;}
    for(int i=head[u];i!=-1;i=e[i].nxt){
        int v=e[i].to;
        if(v==pre)continue;
        dfs2(v,u);
        for(int j=size[u];j>=0;j--)
            for(int k=0;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,-1,sizeof head);
    cin>>n>>m;
    for(int i=1;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+1;i<=n;i++)
        cin>>a[i],size[i]=1;
    memset(dp,-0x3f,sizeof dp);
    for(int i=1;i<=n;i++)dp[i][0]=0;
    dfs1(1,1);dfs2(1,1);

    for(int i=m;i>=0;i--)
        if(dp[1][i]>=0){
            cout<<i<<endl;
            break;
        }
}

原文地址:https://www.cnblogs.com/zsben991126/p/11385191.html

时间: 2024-10-05 05:49:54

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

hdoj1561The more, The Better(树形dp,依赖背包)

题目:hdoj1561The more, The Better 题意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡.你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? 分析: 分类:树形dp入门,依赖背包 做这题前又看了一遍背包9讲,感觉太经典了,尤其是泛化背包,简直是精华.这题的关系就是裸地依赖背包,用树形

hdoj1010Starship Troopers (树状dp,依赖背包)

题目:hdoj1010Starship Troopers 题意:有一个军队n个人要占领m个城市,每个城市有cap的驻扎兵力和val的珠宝,而且这m个城市的占领先后具有依赖关系,军队的每个人可以打败20个城市的防守者,而且占领城市后可以得到城市的珠宝,问最多可以得到多少珠宝? 分类:树形dp入门题,依赖背包 分析:是hdoj1561题目的复杂版,同样我们要构建一颗dp树,从叶子到根往上dp. 定义状态:dp[i][j] 以节点 i  为根节点的子树,花费 j 的兵力可以得到的最大珠宝数. 状态转移

HDU 2955 Robberies --01背包变形

这题有些巧妙,看了别人的题解才知道做的. 因为按常规思路的话,背包容量为浮点数,,不好存储,且不能直接相加,所以换一种思路,将背包容量与价值互换,即令各银行总值为背包容量,逃跑概率(1-P)为价值,即转化为01背包问题. 此时dp[v]表示抢劫到v块钱成功逃跑的概率,概率相乘. 最后从大到小枚举v,找出概率大于逃跑概率的最大v值,即为最大抢劫的金额. 代码: #include <iostream> #include <cstdio> #include <cstring>

hdu 1561 The more, The Better (依赖背包 树形dp)

题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = max(dp[root][j],dp[root][k]+dp[u][j-k]); u递归根结点,root当前根结点,每一个城堡之间的依赖关系形成森林.应该转化为树.再树形dp.仅仅需添加一个根结点即可.m++. 代码: #include<iostream> #include<cstdio&g

LuoGu1064-金明的预算方案(依赖背包 || 分组背包)

题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 打印机,扫描仪 书柜 图书 书桌 台灯,文具 工作椅 无 如果要买归类为附件的物品,必须先买该附件所属的主件.每个主件可以有0个.1个或2个附件.附件不再有从属于

hdu 1011 Starship Troopers (依赖背包 树形dp)

题目: 链接:点击打开链接 题意: n个房间组成一棵树,你有m个战队,从1号房间开始依次clear每个房间,在每个房间需要花费的战队个数是bugs/20,得到的价值是the possibility of capturing a brain,求最大的价值. 算法: 树形dp,有依赖的背包问题.(依次clear每个房间) 思路: 状态转移dp[i][j]表示根结点为i时(房间i)花费j个战队能够得到的最大价值(捕捉到一个brain最大的可能值).递归求出每个根结点处的最大值,最后dp[1][m]就是

codeforce Gym 101102A Coins (01背包变形)

01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXW 15005 #define N 155 #define LL long long #define MOD 1000000007 int w1[N],w2[N]; LL dp1[MAXW],dp2[MAXW]; int main(

hdu 4381(背包变形)

题意: 给定n个块,编号从1到n,以及m个操作,初始时n个块是白色. 操作有2种形式: 1 ai xi : 从[1,ai]选xi个块,将这些块涂白. 2 ai xi:从[ai,n]选xi个块,将这些块涂白. 可以忽略某些操作且如果区间内没有足够的黑块(黑块用于涂白),则不能进行这个操作. 分析: 写写画画一看就知道这道题是一个背包问题. “恰好装满背包”. 以下摘自题解: 本题难点在于正确处理两种操作,不妨假设只有一种操作,那么这种操作如果是1的话那么就把操作按照a从小到大排序,每次都尽量往最左

Wikioi 1025 01背包变形

这题多加了菜品必选编号,所以刚开始不知道怎么写,原来就把必选的处理下就行了,因为有重复,但是相同的价值与价格都一样,所以这里就直接挑出来就行了. 把不是必选的在里面用dp即可,dp之前也要把重复的舍去. 因为总价格容量为浮点数,所以先乘以10变成整数就可以用01背包了. #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque&