http://poj.org/problem?id=3345

https://www.acwing.com/problem/content/326/

题意:

FIPA(国际国际计划协会联合会)近期将进行投票,以确定下一届IPWC(国际规划世界杯)的主办方。

钻石大陆的代表本内特希望通过以赠送钻石买通国家的方式,获得更多的投票。

当然,他并不需要买通所有的国家,因为小国家会跟随着他们附庸的大国进行投票。

换句话说,只要买通了一个大国,就等于获得了它和它统治下所有小国的投票。

例如,C在B的统治下,B在A的统治下,那么买通A就等于获得了三国的投票。

请注意,一个国家最多附庸于一个国家的统治下,附庸关系也不会构成环。

请你编写一个程序,帮助本内特求出在至少获得m个国家支持的情况下的最少花费是多少。

输入格式

输入包含多组测试数据。

第一行包含两个整数n和m,其中n表示参与投票的国家的总数,m表示获得的票数。

接下来n行,每行包含一个国家的信息,形式如下:

CountryName DiamondCount DCName DCName …

其中CountryName是一个长度不超过100的字符串,表示这个国家的名字,DiamondCount是一个整数,表示买通该国家需要的钻石数,DCName是一个字符串,表示直接附庸于该国家的一个国家的名字。

一个国家可能没有任何附庸国家。

当读入一行为#时,表示输入终止。

输出格式

每组数据输出一个结果,每个结果占一行。

数据范围

1<=m<=n<=200

经典的树上背包

dp[i][j]表示获得i国为根节点的j个国家支持最小的支出

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<string>
#define ll long long
#define ull unsigned long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 207;vector<int> V[maxn];
map<string, int> M;
int id, n, m;
int Val[maxn], flag[maxn], dp[maxn][maxn], siz[maxn];
void init() {for (int i = 0; i <= n; i++)V[i].clear();M.clear();id = 0;memset(flag, 0, sizeof flag);memset(siz, 0, sizeof siz);memset(dp, INF, sizeof dp);
}
void tree_dp(int now) {dp[now][0] = 0;siz[now] = 1;for (int i = 0; i < V[now].size(); i++) {int &to = V[now][i];tree_dp(to);siz[now] += siz[to];//for (int j = m; j >= 0; j--);for (int j = siz[now]; j >= 0; j--) {for (int k = j; k >= 0; k--) {dp[now][j] = min(dp[now][j], dp[to][k] + dp[now][j - k]);}}}if (now) {//dp[now][siz[now]] = Val[now]; !!!for (int j = 0; j <= siz[now]; j++)dp[now][j] = min(dp[now][j], Val[now]);}
}
int main() {stringstream ss;string s;while (getline(cin, s)) {if (s[0] == '#')break;ss.clear();ss << s;ss >> n >> m;init();for (int i = 1; i <= n; i++) {getline(cin, s);ss.clear();ss << s;ss >> s;if (!M.count(s))M[s] = ++id;ss >> Val[M[s]];int fat = M[s];while (ss >> s) {if (!M.count(s))M[s] = ++id;V[fat].push_back(M[s]);flag[M[s]] = 1;}}for (int i = 1; i <= id; i++)if (!flag[i])V[0].push_back(i);tree_dp(0);cout << dp[0][m] << endl;}return 0;
}

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. luogu 2014 选课 树上背包

    树上背包 #include<bits/stdc++.h>using namespace std;const int N=310; const int inf=0x3f3f3f3f; vec ...

  3. 【NOI online 2】游戏【二项式反演】【树上背包】

    题意:一棵n=2mn=2mn=2m个点的树,mmm个白点和mmm个黑点.对于k∈[0,n]k\in [0,n]k∈[0,n],求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模9982 ...

  4. P4322 [JSOI2016]最佳团体(分数规划树上背包)

    P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...

  5. 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)

    树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...

  6. 2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)

    2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包) 链接 题意:给出一个n个节点的树(n≤3000n\le3000n≤300 ...

  7. (P2014[CTSC1997])选课(树上背包)

    题目链接:[CTSC1997] 选课 - 洛谷 分析:这是一道树上背包的模板题,什么是树上背包呢?就是说物品之间有依赖关系,就比如说选a就必须要先选b,选b又必须要先选c,大概就是这个意思,类似于我们 ...

  8. 树上背包 CF815C Karen and Supermarket

    CF815C Karen and Supermarket Description Karen有 b b b 美元,超市出售 N N N 种商品.第 i i i 件商品可以以 c i c_i ci​ 美 ...

  9. BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...

  10. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

最新文章

  1. 算法 字符串转换为以为数组
  2. CPU飙高,频繁GC,怎么排查?
  3. 为了测试Writer的发图功能,也为了让girls现身。
  4. 一文搞懂JVM架构和运行时数据区,全网最新
  5. 2022年Java程序设计讲课笔记
  6. Java里面as_与Java中的C#关键字“ as”等效
  7. [置顶] Ubuntu 12.04中文输入法的安装
  8. Struts2请求处理流程及源码分析
  9. Windows PrintNightmare 漏洞和补丁分析
  10. 人人都能懂的Vue源码系列—08—initLifecycle
  11. 关于第十届省赛失败的总结
  12. 错误java.lang.NoClassDefFoundError: org/jaxen/VariableContext
  13. Canvas API(画布)简介
  14. Linux C语言学习day11:递归与结构体
  15. miui12会基于android10吗,全新MIUI12马上发布,基于Android11打造,小米10首批升级
  16. mk编译报错-提示找不到符号
  17. ETL——实现Kettle作业定时任务
  18. 移动硬盘插服务器上坏了,移动硬盘接口坏了怎么办解决教程
  19. 利用Python实现视频中人物的人脸转换超详细教程
  20. daimayuan每日一题#863 吃糖果

热门文章

  1. 如何用python计算增长率_如何用excel函数来计算增长率?
  2. 对硬盘进行分区时,GPT和MBR有什么区别
  3. PyTorch实战 | 文本情感分类任务 | LSTM与LSTM+Attention | TextCNN
  4. 从微信导出表情包的简便方法 (不使用微信 for pc,无需进入文件夹寻找!)
  5. 导出微信添加的自定义表情(动图)
  6. win10上运行ROS时报:qt.qpa.plugin:Cound not find the Qt platform plugin “windows“
  7. 2015年度APP分类
  8. word文档怎么压缩大小?
  9. 西安交大计算机研究生拟录取,西安交通大学2018硕士研究生拟录取名单公示
  10. 上海驾照科目三练习笔记