题目大意:

所有的城市构成一片森林,你想竞选一个职位,就要获得m个城市的支持,你必须去贿赂这m个城市,但是如果以一个城市为根,它有子孙城市,那么你直接贿赂根城市,就不用贿赂它的子孙城市了,问要得到m个支持,至少需要贿赂多少钱;

解题思路:

因为是一片森林,我们先将森林转化为树,把没有父亲结点的结点都与0结点相连接;
树形背包,将不同的子孙结点当做不同组别物品,m当做容量,代码中把size【u】当做容量,因为有可能获得的选票多了反而花费少了;
用dp【i】【j】表示以i城市为根,贿赂j个城市所需要的最少花费;
dp【i】【0】=0;
dp【i】【size【i】】=cost【i】;
转移方程
dp【i】【j】=min(dp【i】【j】,dp[i][j-k]+dp[v][k]);
最后在m-n的范围内寻找最小值就可以了(有的人会怀疑为什么加入0以后不影响结果,因为加入0以后,只有dp【0】【n+1】个结点花费为0,对于其他个数的结点不会影响)
#include<cstdio>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
#define maxn 210
int cnt,head[maxn];
int f[maxn],cost[maxn],size[maxn];
int dp[maxn][maxn];
int n,m;
struct Edge{int to,next;
}edge[2*maxn];
void init()
{cnt=0;memset(head,-1,sizeof(head));memset(f,-1,sizeof(f));memset(dp,0x3f3f3f3f,sizeof(dp));memset(cost,0,sizeof(cost));memset(size,0,sizeof(size));
}
void addedge(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;
}
void tree_dp(int u,int f)
{size[u]=1;dp[u][0]=0;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=f){tree_dp(v,u);size[u]+=size[v];         }}dp[u][size[u]]=cost[u];for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;for(int j=size[u];j>=0;j--)for(int k=0;k<=j;k++)dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]);}
}
int main()
{char s[100];while(gets(s),s[0]!='#'){map<string,int> q;q.clear();init();sscanf(s,"%d%d",&n,&m);int cot=1;for(int i=1;i<=n;i++){char ss[100];int a;scanf("%s%d",ss,&a);if(q.find(string(ss))==q.end())q[ss]=cot++;cost[q[ss]]=a;int root=q[ss];while(getchar()!='\n'){scanf("%s",ss);if(q.find(string(ss))==q.end())q[ss]=cot++;f[q[ss]]=root;addedge(root,q[ss]);}}for(int i=1;i<=n;i++)if(f[i]==-1)addedge(0,i);tree_dp(0,-1);int ans=0x3f3f3f3f;for(int i=m;i<=n;i++)ans=min(ans,dp[0][i]);printf("%d\n",ans);}
}

poj 3345 Bribing FIPA相关推荐

  1. [POJ 3345] Bribing FIPA

    问题描述 There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) ...

  2. POJ3345 Bribing FIPA 【背包类树形dp】

    题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...

  3. linux 下查看应用版本信息,Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等. 1.# uname -a   (Linux查看版本当前操作系统内核信息) 2.# cat /proc/vers ...

  4. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

  5. poj动态规划经典题目

    列表一:经典题目题号: 容易: 1018, 1050, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1191,1208, 1276, 1322, 1 ...

  6. 【转】别人整理的DP大全

    为什么80%的码农都做不了架构师?>>>    动态规划 动态规划 容易: 1018 , 1050 , 1083 , 1088 , 1125 , 1143 , 1157 , 1163 ...

  7. HOJ题目分类//放这儿没事刷刷学算法!嘻嘻!

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  8. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

  9. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  10. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

最新文章

  1. 影像融合操作的几种途径
  2. phpDocument(PHPDoc) 标签大全
  3. 老王学linux-centos6.7drbd8.4.3
  4. html 360shiyanshi,360发布国内首个HTML5实验室 4大特性抢先测
  5. eclipse编码设置
  6. springmvc 的 @PathVariable
  7. android 帧动画的使用
  8. ftp服务器在线查看文件内容,ftp服务器PDF文件在线查看的实现方法
  9. 论文笔记(Neural Graph Collaborative Filtering)
  10. linux的软件很大,linux软件raid10,机器相同,结果差异很大
  11. software engineering homework, product analysis
  12. 子查询 不同情况 mysql
  13. redis-springboot-redistemplate更改序列化方式
  14. wifi密码本 字典(免费)
  15. java项目-第33期基于SSM框架的图书管理系统【毕业设计】
  16. Vivado下载mcs到板子没反应
  17. 蒲公英快速查询苹果手机UDID方法
  18. pwm一个时间单位_时间的换算单位是怎么换算的啊,秒,毫秒,微妙,纳秒等
  19. php发送邮件功能(以QQ邮件为例)
  20. 华为鸿蒙os尝鲜,华为鸿蒙os尝鲜版

热门文章

  1. 漏洞:互联网时代的阿喀琉斯之踵 挖掘漏洞哪家强?
  2. 26. 简述队列和栈的异同
  3. scratch编程钟表
  4. 高通MSM8953平台调整通话音量
  5. MATLAB求最大值max函数
  6. 从Shutterstock下载无水印图片
  7. 如何绕过mac地址过滤_Maccms V8 后台Getshell #2(绕过过滤)
  8. 【网络教程】苹果MACCMS10怎样设置伪静态
  9. 真假iPhone5s的辨别方法,苹果5改5s,iPhone5 改 iPhone5s 识别方法
  10. 人工智能专业志愿该如何填报?