算法复习——背包DP问题
来源:互联网 发布:贵州广电网络机顶盒 编辑:程序博客网 时间:2024/06/15 20:49
额,看到这题目的童鞋不要马上骂博主SB,我要说的其实不是0/1背包问题,而是树型背包。不过其实可以参考一下0/1背包来看这个文章,因为其实很像的。
好吧,讲DP最好的方式还是结合题目一起讲——洛谷1273
点击有屠龙宝刀题目看这里:http://dev.luogu.org:3308/problem/show?pid=1273
首先我们很自然地想到开一个f数组
f[i][j]代表了在i节点为根的子树中选择j个叶子节点的最大值
然后问题就变得很简单了:
f[x][j]=max(f[x][j],f[x][j-k]+f[edge[i].e][k]-edge[i].cost)
其实这就是树型背包的典型公式,也就是说,和0/1背包DP一样:
f[i][j]=max(f[i,j],f[i-1,j-v[i]]+w[i])
都是增加了一个可选物品的同时,在空间允许的情况下把物品加进来,在上面的问题中,物品就是用户,占空间为1,价值为income-cost。
好吧,上代码:
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;struct data{ int next,e,cost;}edge[3030];int n,m,i,j,k,u,v,w,income[3030],head[3030],cnt,f[3030][3030];void adde(int u,int v,int w){ cnt++; edge[cnt].e=v; edge[cnt].cost=w; edge[cnt].next=head[u]; head[u]=cnt;}int calc(int x){ if (x>n-m) { f[x][1]=income[x]; return 1; } int son=0; for (int i=head[x];i!=-1;i=edge[i].next) { int part=calc(edge[i].e); son+=part; for (int j=son;j;j--) for (int k=1;k<=part;k++) f[x][j]=max(f[x][j],f[x][j-k]+f[edge[i].e][k]-edge[i].cost); } return son;}int main(){ scanf("%d%d",&n,&m); for (i=1;i<=n;i++) head[i]=-1; for (i=1;i<=n-m;i++) { scanf("%d",&k); for (j=1;j<=k;j++) { int a,c; scanf("%d%d",&a,&c); adde(i,a,c); } } for (i=n-m+1;i<=n;i++) scanf("%d",&income[i]); memset(f,-60,sizeof(f)); for (i=1;i<=n;i++)f[i][0]=0; calc(1); for (i=m;i;i--) if (f[1][i]>=0) break; printf("%d",i); return 0;}
0 0
- 算法复习——背包DP问题
- DP —> 背包问题
- 01背包问题——<DP>
- 0—1背包问题(dp)
- DP算法入门(1)——多重背包问题(POJ1276题解)
- DP算法入门(2)——完全背包问题(POJ2063题解)
- 算法讲解之Dynamic Programing —— 背包DP [资源分配问题]
- 【DP算法篇之初学】背包问题
- DP算法----背包问题(上)
- 背包问题复习
- 背包问题复习2
- 【算法复习二】0-1背包问题总结
- 【DP复习3—完全背包】HDU 1114——Piggy-Bank
- 算法——背包问题 01背包+完全背包+多重背包
- dp—完全背包
- 贪心算法——背包问题
- 经典算法之—背包问题
- DP 背包问题 01背包
- Python学习笔记(七)
- 模拟实现auto_ptr、scoped_ptr、shared_ptr等智能指针
- sql联合查询(内联、左联、右联、全联)
- 两种方式解决jquery Ajax 发送中文乱码的方法,
- MyBatis级联探讨第一篇——概念和模型
- 算法复习——背包DP问题
- 工作中最全最常用的正则表达式
- 安装intelhaxm-android.exe时,屏幕一闪而过
- 打开方式中设置默认打开方式时,选择的程序不会出现到设置默认方式的编辑框中的解决方法
- JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
- 241. Different Ways to Add Parentheses
- ScrollView嵌套可以水平滚动的自定义控件时滑动事件冲突问题解决办法
- 第1章 操作系统的导论
- Android中JNI的使用方法