【算法】动态规划之背包DP与树形DP

news2024/11/24 21:08:20

前言:

本系列是学习了董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

动态规划系列 

【算法】动态规划之线性DP问题-CSDN博客

【算法】动态规划之背包DP问题(2024.5.11)-CSDN博客

背包DP

背包问题方案数

f[i]表示背包容量为i时能装入物品的最大价值,c[i]表示营包容量为i时最优选法的方案数

for (int i = 0; i <= m; i++) c[i] = 1;//背包里不装入物品也是一种方案
	for (int i = 1; i <= n; i++)
	{
		scanf("%d%d", &v, &w);
		for (int j = m; j >= v; j--) {
			if (f[j - v] + w > f[j]) {//容量从j-v增加到j,只是多装入一件物品,没有改变方案数c[j-v]所以c[j] = c[j-v]
				f[j] = f[j - v] + w;
				c[j] = c[j - v];
			}
			else
				//不装入新物品,容量j已有的方案数为c[j]; 
				//若装入新物品,容量j对应的方案数为c[j - v]
				//两种情况,方案显然不同,所以取和。为防止爆掉int,对大数取余
				c[j] = (c[j] + c[j - v]) % mod;
		}
	}
	printf("%d\n", c[m]);

背包问题求具体方案

题目要求输出字典序最小的方案,假设存在一个包含第1个物品的最优解,为了确保字典序最小那么我们必然要选第1个。那么问题就转化成从2~N这些物品中找到最优解。

首先,我们从后向前遍历物品,让最优解落在f[1][m]中;

然后,我们从f[1][m]开始搜索字典序最小的路径方案。

状态定义:f[i][j]表示从第i个物品到最后一个物品装入容量为j的背包的最优解。

状态转移:f[i][j]= max(f[i+1][j],f[i+1][j-v[i]]+ w[i])

  for(int i=1; i<=n; i++) cin>>v[i]>>w[i];
  
  for(int i=n; i>=1; i--)   //逆序取物 
  for(int j=0; j<=m; j++){  
    f[i][j]=f[i+1][j];
    p[i][j]=j;              //记录路径列 
    if(j>=v[i])
      f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);
    if(j>=v[i] && f[i][j]==f[i+1][j-v[i]]+w[i])
      p[i][j]=j-v[i];//记录路径列
  }
 int j=m;
  for(int i=1; i<=n; i++){//找路
    if(p[i][j]<j){
      printf("%d ",i);
      j=p[i][j];
    }

树形DP

一般思路:

      线形DP子结构是一条线段,树形DP子结构是一颗子树。从分析子树入手,最优解通常是与子树根节点u有关的函数,状态计算就是寻找根点与子节点以及边权的递推关系。

      编写代码,通常要dfs,从根到叶一路深搜,再从叶到根做后序DP,每次用其子树的f值更新当前节点的f值,兜了一圈回到根节点根节点的f值就是全局最优解。

没有上司的舞会

P1352 没有上司的舞会 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

存储代码

vector<int>a[N];
 cin >> x >> y;
a[y].push_back(x);

核心代码

void dfs(int u) {//深搜节点+后序DP
    f[u][1] = w[u];//选u的快乐指数
    for (int v : a[u]) {
        dfs(v);
        f[u][0] += max(f[v][0], f[v][1]);//不选择根节点的话,他的子节点可选可不选(根据题意)
        f[u][1] += f[v][0];//选择根节点,子节点不可以选(根据题意)
    }

 总代码

#include<iostream>
#include<vector>
using namespace std;
const int N =6010;
int n;
int w[N];
vector<int> a[N];
bool fa[N];
int f[N][2];

void dfs(int u) {//深搜节点+后序DP
    f[u][1] = w[u];//选u的快乐指数
    for (int v : a[u]) {
        dfs(v);
        f[u][0] += max(f[v][0], f[v][1]);//不选择根节点的话,他的子节点可选可不选(根据题意)
        f[u][1] += f[v][0];//选择根节点,子节点不可以选(根据题意)
    }


}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)  
        cin >> w[i];//存储快乐指数
    for (int i = 0; i < n - 1; i++) {
        int x, y;
        cin >> x >> y;
        //把y的邻接点x存入数组a
         //y的邻接点个数存入b数组中去
        a[y].push_back(x);
        fa[x] = true;//x有父亲节点
    }
    int root = 1;
    while (fa[root])  root++;//找根节点 如果他有父亲节点的话就说明他不是根节点
    dfs(root);
    cout << max(f[root][0], f[root][1]);//选择根节点或者不选择根节点

}

树形背包

 对01背包进行的改造:

f[i]表示背包容量为i时能装入物品的最大价值
c[i]表示营包容量为i时最优选法的方案数 

void dfs(int u){
  for(int i=v[u];i<=m;i++) f[u][i]=w[u];//如果选u的话,体积不能够小于v[u]
  for(int i=0;i<b[u];i++){  //子节点 
    int s=a[u][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 dfs(int u)
{
	vis[u] = true;
	int size = 0;//记录u的最大子树的结点数;
	int sum = 1;//记录以u为根的子树的结点数:
	for (int i = h[u]; i != -1; i = ne[i]) {//i是边的编号
		int j = e[i];//j是u的邻接点
		if (vis[j]) continue;//避免向上搜索
		int s = dfs(j);//s是以j为根的字数的节点数
		size = max(size, s);//记录u的最大子树的结点数
		sum += s;//累加u的各个子树的结点数
	}
	ans = min(ans, max(size, n - sum)); //n-sum u上面的部分的结点数:
	return sum;
}

树的最长路径

找到一条路径,使得路径两端点的距离最远。

思路:找到从根节点向下走的最长路径和次长路径加起来

int dfs(int u)
{
	vis[u] = true;
	int d1 = 0;//最长
	int d2 = 0;//次长
	for (int i = h[u]; i != -1; i = ne[i]) {
		int j = e[i];//j是u的临界点
		if (vis[j]) continue;
		int d = dfs(j) + w[i];//从u经过j点往下走的最大长度
		if (d >= d1)//比最长还要长
		{
			d2 = d1;
			d1 = d;
		}
		else if (d > d2) {
			d2 = d;
		}
	}
	ans = max(ans, d1 + d2);
	return ans;
}

树的中心

定义

该点到树中其他点的最远距离最近

思路

分类处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1669842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银河麒麟服务器操作系统ssh服务无法启动报exit-code

尝试重装ssh服务后依然无法解决&#xff0c;查看日志journalctl -xe&#xff0c;发现可能是ssh配置文件权限问题导致的。 journalctl -xe AWARNING: UNPROTECTED PRIVATE KEY FILE! AA Permissions 0755 for /etc/ssh/ssh_host_rsa_key are too open. A It is required that …

EPAI手绘建模APP工程图工具栏

(2) 工程图工具栏 ① 模板 1) 打开模板选择页面。 图 306 工程图模板列表 2) 模板选择页面列出了可以使用的工程图模板类型&#xff0c;每个模板规定了工程的大小、方向、规格、标准、常用字段等。也包括一些空白模板&#xff0c;此时可以通过添加表格等注释自定义工程图样式…

苹果15适合用哪些充电宝充电?苹果15可以用充电宝推荐

在如今移动设备如此普遍的时代&#xff0c;充电宝已成为我们日常生活中不可或缺的一部分。对于拥有苹果15的用户来说&#xff0c;选择一款适合的充电宝尤为重要。因为接口以及苹果手机配置上的一个升级&#xff0c;市面上很多普通充电宝已经不能兼容苹果15充电了。苹果15作为一…

5.10.8 Transformer in Transformer

Transformer iN Transformer (TNT)。具体来说&#xff0c;我们将局部补丁&#xff08;例如&#xff0c;1616&#xff09;视为“视觉句子”&#xff0c;并将它们进一步划分为更小的补丁&#xff08;例如&#xff0c;44&#xff09;作为“视觉单词”。每个单词的注意力将与给定视…

ChatGLM 本地部署指南(问题解决)

硬件要求&#xff08;模型推理&#xff09;&#xff1a; INT4 &#xff1a; RTX3090*1&#xff0c;显存24GB&#xff0c;内存32GB&#xff0c;系统盘200GB 如果你没有 GPU 硬件的话&#xff0c;也可以在 CPU 上进行推理&#xff0c;但是推理速度会更慢。 模型微调硬件要求更高。…

高效测评系统方案助力沃尔玛、亚马逊卖家提升产品销量

无论在哪个电商平台&#xff0c;测评确实是最有效的推广方式。测之前一定要选好产品&#xff0c;因为对于大部分卖家而言&#xff0c;不可能你店铺里所有的都是爆款&#xff0c;所以选择的是需要有潜力成为爆款的产品。测评是指通过搭建安全的环境模拟真实的买家购物行为&#…

AH1515-12v转3V20A电源芯片

AH1515-12v转3V20A电源芯片&#xff1a;一款强大的电源解决方案 在当今的电子设备领域&#xff0c;电源管理的重要性不言而喻。一款优秀的电源芯片能够为各种设备提供稳定、高效的电能转换。今天&#xff0c;我们将为大家介绍一款极具特色的电源芯片——AH1515。这款芯片将为您…

FMEA存在的五个主要不足及改进措施——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在制造业和产品设计领域&#xff0c;失效模式与影响分析&#xff08;Failure Modes and Effects Analysis&#xff0c;简称FMEA&#xff09;被广泛运用&#xff0c;用于预防潜在的设计或制造缺陷。然而&#xff0c;尽管FMEA在风险管理方面发挥…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

加州大学欧文分校英语高级语法专项课程01:Verb Tenses and Passives 学习笔记

Verb Tenses and Passives Course Certificate Course Intro 本文是学习 Verb Tenses and Passives 这门课的学习笔记。 文章目录 Verb Tenses and PassivesWeek 01: Simple, Progressive, and Perfect Verb Tenses ReviewLearning Objectives Present Perfect Tense Review L…

Spring Cloud Alibaba Sentinel 集成与限流实战(6)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…

MySQL————创建存储过程函数

存储过程使用大纲 有参数传递 delimiter $$ 声明一个名称为get_student_introduce create procedure add_student_infor( in p_userName VARCHAR(20),in p_phone VARCHAR(11),in p_sex char(2),in p_introduce VARCHAR(255)) 开始操作 BEGIN 撰写真正在操作DMLDQL都行 INSE…

Transformer模型详解04-Encoder 结构

文章目录 简介基础知识归一化作用常用归一化 残差连接 Add & NormFeed Forward代码实现 简介 Transformer 模型中的 Encoder 层主要负责将输入序列进行编码&#xff0c;将输入序列中的每个词或标记转换为其对应的向量表示&#xff0c;并且捕获输入序列中的语义和关系。 具…

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件&#xff1a;将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上&#xff08;因安装exe4…

Android面试题之Kotlin和Java之间互操作

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 互操作性和可空性 要注意Java中所有类型都是可空的String!表示平台数据类型 public class JavaTest {public String generateName() {return …

2024中国(重庆)无人机展览会8月在重庆举办

2024中国(重庆)无人机展览会8月在重庆举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 报名&#xff1a;【交易会I 59交易会2351交易会9466】 展会背景&#xff1a; 为更好的培养航空航天产业和无人…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 示例代码如下&#xff1a; import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

CSDN使用

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Python-VBA函数之旅-sum函数

目录 一、sum函数的常见应用场景 二、sum函数使用注意事项 三、如何用好sum函数&#xff1f; 1、sum函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、sum函数的常…

AI绘画神级Stable Diffusion入门教程|快速入门SD绘画原理与安装

什么是Stable Diffusion&#xff0c;什么是炼丹师&#xff1f;根据市场研究机构预测&#xff0c;到2025年全球AI绘画市场规模将达到100亿美元&#xff0c;其中Stable Diffusion&#xff08;简称SD&#xff09;作为一种先进的图像生成技术之一&#xff0c;市场份额也在不断增长&…