动态规划(算法竞赛、蓝桥杯)--树形DP树形背包

1、B站视频链接:E18 树形DP 树形背包_哔哩哔哩_bilibili

cpp 复制代码
#include <bits/stdc++.h> 
using namespace std;
const int N=110;
int n,V,p,root;
int v[N],w[N]; 
int h[N],to[N],ne[N],tot; //邻接表
int f[N][N];

void add(int a,int b){
  to[++tot]=b;ne[tot]=h[a];h[a]=tot;
}
void dfs(int u){
  for(int i=v[u];i<=V;i++) f[u][i]=w[u];
  for(int i=h[u]; i; i=ne[i]){  //子节点 
    int s=to[i];
    dfs(s);
    for(int j=V;j>=v[u];j--)    //体积
      for(int k=0;k<=j-v[u];k++)//决策
        f[u][j]=max(f[u][j],f[u][j-k]+f[s][k]);
  }
}
int main(){
  cin>>n>>V;              //物品个数,背包容量
  for(int i=1;i<=n;i++){
    cin>>v[i]>>w[i]>>p;   //体积,价值,依赖的物品编号
    if(p==-1) root=i;
    else add(p,i);
  }
  dfs(root);
  cout<<f[root][V];
  return 0;
}

2、题目链接:[CTSC1997] 选课 - 洛谷

cpp 复制代码
#include <bits/stdc++.h> 
using namespace std;
const int N=305;
vector<int> e[N]; //邻接表
int n, m, w[N];
int f[N][N];

void dfs(int u){
  f[u][1]=w[u];
  for(auto v : e[u]){         //子节点
    dfs(v);
    for(int j=m+1; j>=1; j--) //课程数
      for(int k=0; k<j; k++)  //决策
        f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1; i<=n; i++){
    int k; scanf("%d%d",&k,&w[i]);
    e[k].push_back(i);
  }
  dfs(0); //虚拟根节点0
  printf("%d",f[0][m+1]);
  return 0;
}

[NOIP2006 提高组] 金明的预算方案 - 洛谷

相关推荐
白羊by21 小时前
YOLOv1~v11 全版本核心演进总览
深度学习·算法·yolo
墨尘笔尖1 天前
最大最小值降采样算法的优化
c++·算法
white-persist1 天前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
FL16238631291 天前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
baizhigangqw1 天前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹1 天前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25011 天前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
Hugh-Yu-1301231 天前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥1 天前
C++类和对象
开发语言·c++·算法
加农炮手Jinx1 天前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣