hdu 4003 Find Metal Mineral(树形DP+分组背包,每个物品必须只能选一次)

本文主要是介绍hdu 4003 Find Metal Mineral(树形DP+分组背包,每个物品必须只能选一次),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、http://acm.hdu.edu.cn/showproblem.php?pid=4003

2、题目大意:

一棵树有n个结点,根节点是s,在树上放k个机器人,现在使得k个机器人将所有结点遍历一遍最小的代价是多少?

dp[i][j]表示以i为根节点放j个机器人消耗的最小代价,

因为必须选择选择每个分组中的一个,我们可以将dp[u][0]先放进去,如果有更好的再替换它

for(int j=m;j>=0;j--)
            {
                dp[u][j]+=dp[vv][0]+w[i]*2;
                for(int k=1;k<=j;k++)
                {
                    dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[vv][k]+k*w[i]);
                }
            }

3、AC代码;

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 10005
int head[N*2],next[N*2],v[N*2],w[N*2];
int tot,m;
int dp[N][15];
void add_edge(int a,int b,int c)
{v[tot]=b;w[tot]=c;next[tot]=head[a];head[a]=tot++;
}
void dfs(int u,int fa)
{for(int i=head[u];i!=-1;i=next[i]){int vv=v[i];if(vv!=fa){dfs(vv,u);for(int j=m;j>=0;j--){//先将dp[vv][0]放进去,如果有更好的再将它替换,保证每组中都选一个dp[u][j]+=dp[vv][0]+w[i]*2;for(int k=1;k<=j;k++){dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[vv][k]+k*w[i]);}}}}
}
int main()
{int n,s,a,b,c;while(scanf("%d%d%d",&n,&s,&m)!=EOF){tot=0;memset(head,-1,sizeof(head));memset(dp,0,sizeof(dp));for(int i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);add_edge(a,b,c);add_edge(b,a,c);}dfs(s,-1);printf("%d\n",dp[s][m]);}return 0;
}


 

这篇关于hdu 4003 Find Metal Mineral(树形DP+分组背包,每个物品必须只能选一次)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369689

相关文章

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组