题目:题目链接

思路:不难看出,合成每个宝石需要消耗一定的魔力值,每个宝石有一定的收益,所以只要我们知道每个宝石合成的最小花费,该题就可以转化为一个背包容量为初始魔力值的完全背包问题,每个宝石的最小花费可以用dijkstra跑一遍最短路算出,路径长度用合成花费表示。

AC代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <vector>
  6. #include <queue>
  7.  
  8. using namespace std;
  9.  
  10. const int maxn = + ;
  11.  
  12. int vol, n, m, INF;
  13.  
  14. struct node {
  15. int c, w;
  16. vector<int> v;
  17. vector<vector<pair<int, int> > > vec;
  18. friend bool operator < (node a, node b) {
  19. return a.w > b.w;
  20. }
  21. }gem[maxn];
  22.  
  23. priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > q;
  24.  
  25. bool vis[maxn];
  26.  
  27. void init() {
  28. for(int i = ; i <= n; ++i) {
  29. for(int j = ; j < gem[i].vec.size(); ++j)
  30. gem[i].vec[j].clear();
  31. gem[i].vec.clear();
  32. gem[i].v.clear();
  33. }
  34. while(!q.empty())
  35. q.pop();
  36. memset(vis, false, sizeof(vis));
  37. }
  38.  
  39. bool get_sum(int id) {
  40. int sum, _min = INF;
  41. for(int i = ; i < gem[id].vec.size(); ++i) {
  42. sum = ;
  43. for(int j = ; j < gem[id].vec[i].size(); ++j) {
  44. sum += gem[gem[id].vec[i][j].first].c * gem[id].vec[i][j].second;
  45. if(sum > INF)
  46. sum = INF;
  47. }
  48. _min = min(_min, sum);
  49. }
  50. if(_min < gem[id].c) {
  51. gem[id].c = _min;
  52. return true;
  53. }
  54. return false;
  55. }
  56.  
  57. void dijkstra() {
  58. while(!q.empty()) {
  59. pair<int, int> P = q.top();
  60. q.pop();
  61. if(vis[P.second])
  62. continue;
  63. vis[P.second] = true;
  64. for(int i = ; i < gem[P.second].v.size(); ++i) {
  65. if(!vis[gem[P.second].v[i]] && get_sum(gem[P.second].v[i])) {
  66. q.push(make_pair(gem[gem[P.second].v[i]].c, gem[P.second].v[i]));
  67. }
  68. }
  69. }
  70. }
  71.  
  72. int dp[maxn];
  73.  
  74. int main()
  75. {
  76. ios::sync_with_stdio();
  77. cin.tie();
  78.  
  79. int T, t = ;
  80. cin >> T;
  81. while(T--) {
  82. cin >> vol >> n >> m;
  83. INF = vol + ;
  84. init();
  85. int flag;
  86. for(int i = ; i <= n; ++i) {
  87. cin >> flag;
  88. if(flag)
  89. cin >> gem[i].c >> gem[i].w;
  90. else {
  91. cin >> gem[i].w;
  92. gem[i].c = INF;
  93. }
  94. }
  95. int id, num, c, nu;
  96. vector<pair<int, int> > ope;
  97. for(int i = ; i < m; ++i) {
  98. cin >> id >> num;
  99. ope.clear();
  100. for(int j = ; j < num; ++j) {
  101. cin >> c >> nu;
  102. ope.push_back(make_pair(c, nu));
  103. gem[c].v.push_back(id);
  104. }
  105. gem[id].vec.push_back(ope);
  106. }
  107.  
  108. for(int i = ; i <= n; ++i)
  109. if(gem[i].c < INF)
  110. q.push(make_pair(gem[i].c, i));
  111.  
  112. dijkstra();
  113.  
  114. memset(dp, , sizeof(dp));
  115. for(int i = ; i <= n; ++i)
  116. for(int v = ; v <= vol; ++v)
  117. if(v >= gem[i].c)
  118. dp[v] = max(dp[v], dp[v - gem[i].c] + gem[i].w);
  119.  
  120. cout << "Case #" << ++t << ": " << dp[vol] << endl;
  121. }
  122. return ;
  123. }

Mr. Panda and Crystal HDU - 6007 最短路+完全背包的更多相关文章

  1. hdu6007 Mr. Panda and Crystal 最短路+完全背包

    /** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...

  2. HDU 6007 Mr. Panda and Crystal (背包+spfa)

    题意:你生活在一个魔法大陆上,你有n 魔力, 这个大陆上有m 种魔法水晶,还有n 种合成水晶的方式,每种水晶价格告诉你,并且告诉你哪些水晶你能直接造出来,哪些你必须合成才能造出来,问你n魔力最多能卖多 ...

  3. Mr. Panda and Crystal(最短路+完全背包)

    http://codeforces.com/gym/101206/attachments 题意: T组输入,每组给出m,n,k,m为能量总数,n为水晶种类数,k为合成方案数.有的水晶可以用能量制造,有 ...

  4. HDU 3339 最短路+01背包

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. ACM: HDU 2544 最短路-Dijkstra算法

    HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descrip ...

  6. UESTC 30 &&HDU 2544最短路【Floyd求解裸题】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. HDU 3339 In Action【最短路+01背包】

    题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3339] In Action Time Limit: 2000/1000 MS (Java/Other ...

  9. 2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定理

    2018 China Collegiate Programming Contest Final (CCPC-Final 2018)-K - Mr. Panda and Kakin-中国剩余定理+同余定 ...

随机推荐

  1. SpringBoot---核心---基本配置

    1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件

  2. 056 Merge Intervals 合并区间

    给出一个区间的集合, 请合并所有重叠的区间.示例:给出 [1,3],[2,6],[8,10],[15,18],返回 [1,6],[8,10],[15,18].详见:https://leetcode.c ...

  3. Hadoop数据管理

    本节主要从三方面介绍Hadoop数据管理:分布式文件系统HDFS.分部式数据库HBase和数据仓库工具Hive. 1. HDFS的数据管理 HDFS是分布式计算的存储基石,Hadoop分布式文件系统和 ...

  4. Shell分割字符得到数组

    #!/bin/bash p=$(hadoop fs -ls /tgl/data |awk '{print $8}') #要将$a分割开,先存储旧的分隔符 OLD_IFS="$IFS" ...

  5. BeanCopier使用说明

    BeanCopier从名字可以看出了,是一个快捷的bean类复制工具类. 一 如何使用,我就直接丢代码了 public class BeanCopierTest { static SimpleDate ...

  6. JFileChooser 打开文件选择(一)

    import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; public clas ...

  7. java的三大特性之一多态概述

    多态---概念 所谓多态就是一个引用在不同情况下的多种状态.多态是指通过指向父亲的指针,来调用在不同的子类中实现的方法. 多态---注意事项 00.java允许父类的引用变量引用它的子类的实例(对象) ...

  8. 关于Linux系统启动时出现UVD not responding, Trying to reset the vcpu问题的解决

    本人的老古董笔记本!不知道什么时候显卡烧坏了 每次启动Linux的时候就会出现错误,信息如下: UVD not responding, trying to reset the VCPU! 讲道理,显卡 ...

  9. JavaWeb_03_JavaScript学习小结1

    1.javascript的简介 是基于对象和事件驱动的语言,应用于客户端. 基于对象: 提供好了很多对象,可以直接拿过来使用 事件驱动: html做网站静态效果,javascript动态效果 客户端: ...

  10. 织梦list/arclist标签调用文章内容

    list标签: 1. 进入后台->模型表单-> 频道模型 -> 内容模型管理 -> 修改对应的模型 2. 列表附加字段-填写body 3. 调用时添加“addfields='b ...