博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 4003 Find Metal Mineral(树形DP+分组背包,每个物品必须只能选一次)
阅读量:4037 次
发布时间:2019-05-24

本文共 1158 字,大约阅读时间需要 3 分钟。

1、

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
#include
#include
using namespace std;#define N 10005int 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

 

转载地址:http://grddi.baihongyu.com/

你可能感兴趣的文章
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>