依赖背包变形(经典)——poj1155
2024-10-07 20:38:53
这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可
每个节点的容量定义为这个节点下的叶子结点个数,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;
}
}
最新文章
- JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server
- 初识ReactJs(一)
- express-12 Cookie与会话
- eclipse项目导入androidstudio
- json format validator
- hdu---(Tell me the area)(几何/三角形面积以及圆面积的一些知识)
- ubuntu下设置开机自启动项
- 低压差稳压器AMS1585
- VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建
- JS和JQuery中的事件托付 学习笔记
- 在Docker中体验数据库之Microsoft SQL Server
- [翻译 EF Core in Action] 1.5 关于NoSql
- 在.net core web项目中生成二维码
- D3
- idea生成类注释和方法注释的正确方法
- localStorage单页面及不同页面监听变动
- Linux常用基本命令(head)
- dvwa 源码分析(四) --- dvwaPhpIds.inc.php分析
- e663. 在gif图像中获取透明和色彩的数量