http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326

题意:

n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做出来,并且坑题具有传递性。(a和b一起做会坑、b和c会坑则a和c也会坑) 它们最多可以作出多少价值的题目。

分析:先用并查集,将组分出来,然后进行分组背包

注意F数组,数组开辟的大小应该为总价值的最大值,还有初始化别忘记了

以及j-pi[i]>=0
一维数组:

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. #define LL long long
  7. const int MOD=;
  8. const int MN=;
  9. int father[MN];
  10. int num[MN][MN];
  11. int rank[MN];
  12. int f[MN];
  13. int val[MN],pi[MN];
  14. int vis[MN];
  15. int cnt[MN];
  16.  
  17. void Make_set(int n)
  18. {
  19. for(int i=; i<=n; i++)
  20. {
  21. father[i]=i;
  22. }
  23. }
  24.  
  25. int Find(int x)
  26. {
  27. if(x!=father[x])
  28. father[x]=Find(father[x]);
  29. return father[x];
  30. }
  31.  
  32. void Union(int x,int y)
  33. {
  34. if(x==y) return ;
  35. father[x]=y;
  36. }
  37.  
  38. int main()
  39. {
  40. int i,j,k,n,m;
  41. while(scanf("%d%d%d",&n,&m,&k)!=EOF)
  42. {
  43. Make_set(n);
  44. for(i=; i<=n; i++)
  45. {
  46. scanf("%d%d",&val[i],&pi[i]);
  47. }
  48. int a,b;
  49. for(i=; i<=k; i++)
  50. {
  51. scanf("%d%d",&a,&b);
  52. int x=Find(a);
  53. int y=Find(b);
  54. Union(x,y);
  55. }
  56. memset(vis,,sizeof(vis));
  57. for(i=; i<=n; i++)
  58. {
  59. int t=Find(i);
  60. vis[t]++;
  61. }
  62. int cas=;
  63. for(i=; i<=n; i++)
  64. {
  65. if(vis[i])
  66. {
  67. ++cas;
  68. int tes=;
  69. for(j=; j<=n; j++)
  70. {
  71. if(father[j]==i)
  72. num[cas][++tes]=j;
  73. }
  74. cnt[cas]=vis[i];
  75. }
  76. }
  77. memset(f,,sizeof(f));
  78. for(i=;i<=cas;i++)
  79. {
  80. for(j=m;j>=;j--)
  81. {
  82. for(k=;k<=cnt[i];k++)
  83. {
  84. int xx=num[i][k];
  85. if(j-pi[xx]>=) f[j]=max(f[j],f[j-pi[xx]]+val[xx]);
  86. }
  87. }
  88. }
  89. printf("%d\n",f[m]);
  90. }
  91. return ;
  92. }

二维数组:

循环取最大值的那里要小心,始终要和f[i-1][j]进行比较

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. #define LL long long
  7. const int MOD=;
  8. const int MN=;
  9. int father[MN];
  10. int num[MN][MN];
  11. int rank[MN];
  12. int f[MN][MN];
  13. int val[MN],pi[MN];
  14. int vis[MN];
  15. int cnt[MN];
  16.  
  17. void Make_set(int n)
  18. {
  19. for(int i=; i<=n; i++)
  20. {
  21. father[i]=i;
  22. }
  23. }
  24.  
  25. int Find(int x)
  26. {
  27. if(x!=father[x])
  28. father[x]=Find(father[x]);
  29. return father[x];
  30. }
  31.  
  32. void Union(int x,int y)
  33. {
  34. if(x==y) return ;
  35. father[x]=y;
  36. }
  37.  
  38. int main()
  39. {
  40. int i,j,k,n,m;
  41. while(scanf("%d%d%d",&n,&m,&k)!=EOF)
  42. {
  43. Make_set(n);
  44. for(i=; i<=n; i++)
  45. {
  46. scanf("%d%d",&val[i],&pi[i]);
  47. }
  48. int a,b;
  49. for(i=; i<=k; i++)
  50. {
  51. scanf("%d%d",&a,&b);
  52. int x=Find(a);
  53. int y=Find(b);
  54. Union(x,y);
  55. }
  56. memset(vis,,sizeof(vis));
  57. for(i=; i<=n; i++)
  58. {
  59. int t=Find(i);
  60. vis[t]++;
  61. }
  62. int cas=;
  63. for(i=; i<=n; i++)
  64. {
  65. if(vis[i])
  66. {
  67. ++cas;
  68. int tes=;
  69. for(j=; j<=n; j++)
  70. {
  71. if(father[j]==i)
  72. num[cas][++tes]=j;
  73. }
  74. cnt[cas]=vis[i];
  75. }
  76. }
  77. memset(f,,sizeof(f));
  78. for(i=;i<=cas;i++)
  79. {
  80. for(j=m;j>=;j--)
  81. {
  82. for(k=;k<=cnt[i];k++)
  83. {
  84. int xx=num[i][k];
  85. if(j-pi[xx]>=)
  86. {
  87. f[i][j]=max(f[i][j],f[i-][j-pi[xx]]+val[xx]);
  88. f[i][j]=max(f[i-][j],f[i][j]);
  89. }
  90. else f[i][j]=max(f[i][j],f[i-][j]);
  91. }
  92. }
  93. }
  94. printf("%d\n",f[cas][m]);
  95. }
  96. return ;
  97. }

分组背包:http://www.nocow.cn/index.php/%E5%88%86%E7%BB%84%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98

CSU 1326: The contest(分组背包)的更多相关文章

  1. csu 1326 The contest

    裸的   并查集  +  分组背包: #include<iostream> #include<cstring> #include<algorithm> #inclu ...

  2. ACboy needs your help(HDU 1712 分组背包入门)

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. CSU 1326:The contest(并查集+分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:…… 思路:并查集建图处理出边,然后分组背包. 之前不会分组背包,比赛的时候也推不出来 ...

  4. CSU - 1580 NCPC2014 Outing(树形依赖+分组背包)

    Outing Input Output Sample Input 4 4 1 2 3 4 Sample Output 4 分组背包: for 所有的组k for v=V..0 for 所有的i属于组k ...

  5. HDU 3033 分组背包变形(每种至少一个)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU 1712 分组背包

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. HDU3535AreYouBusy[混合背包 分组背包]

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

  8. I love sneakers!(分组背包HDU3033)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu 3535 AreYouBusy 分组背包

    AreYouBusy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

随机推荐

  1. Josn转换

    也是搬的,大家勿喷,贴出来只为了自己记忆查找 需要引用 System.Web.Extensions.dll 这个类库 命名空间: System.Web.Script.Serialization 数据结 ...

  2. JVM虚拟机 - 内存

    在JVM虚拟机中,内存部分大致可以分为以下几类: Heap:堆 NonHeap:非堆 CodeCache:缓存编辑后的机器码的内存区域 CompressedClassSpace:类压缩空间 MetaS ...

  3. iOS 基础笔试题

    参考:https://www.jianshu.com/p/1d3496bc5bda 1.#import 跟#include.@class有什么区别?#import<> 跟 #import& ...

  4. Android中渐变图片失真的解决方案

    在android开发(尤其是android游戏开发)中有一个很严重的问题就是带有渐变效果的png图片会出现严重的banding(色带),鉴于这种情况,有几种可行的解决方法:   1.如果Activit ...

  5. 不该被忽视的CoreJava细节(一)

    一.系列文章导言 <不该被忽视的CoreJava细节>系列文章将会持续更新.我希望自己通过这一系列文章的写作,能与读者一起进步,逐步完善对Java体系结构的了解. 二.本期关注点 几乎翻看 ...

  6. javascript字符串格式化string.format

    String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, fu ...

  7. spring boot 下 spring security 自定义登录配置与form-login属性详解

    package zhet.sprintBoot; import org.springframework.beans.factory.annotation.Autowired;import org.sp ...

  8. 数据字典的设计--4.DOM对象的ajax应用

    需求:点击下拉选项框,选择一个数据类型,在表单中自动显示该类型下所有的数据项的名称,即数据库中同一keyword对应的所有不重复的ddlName.      1.在dictionaryIndex.js ...

  9. jq动态增加的button标签click回调失效的问题,即动态增加的button标签绑定事件$("button.class").click(function)无效

    对于新增加的页面元素,改变了页面结构,如果是使用老办法$("button.class").click(function)去监听新的button标签事件,会失效. 笔者的应用是文字的 ...

  10. Dll注入:Windows消息钩子注入

    SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之 ...