给出一群女孩的重量和颜值 和她们的朋友关系 现在有一个舞台 ab是朋友 bc是朋友 ac就是朋友 给出最大承重 可以邀请这些女孩来玩

对于每一个朋友团体 全邀请or邀请一个or不邀请 问能邀请的女孩的最大颜值

比赛的时候一看就是个背包问题 似乎在背包九讲上面见过..但是不会写

于是百度.."背包 一类选一个"

百度出了分组背包 并且第一个搜索结果就是类似于原题的东西..

只不过分组背包的模板是一个or不要 加了个bfs 把朋友团体作为一个新朋友加入进这个团体 改了改代码..就a了..

虽然fst掉了c...

后来学习了一下 发现分组背包是这样写的

for(int i=1;i<=n;i++)枚举每一个分组

for(int j=V;j>=0;j++)枚举背包容量

for(int k=1;k<=x;k++)枚举i分组里面的所有物品

dp[j] = max(dp[j],dp[j-vol[k]]+val[k]);

当然二维的比较好理解...

在这个题中 并查集和bfs统计朋友团体都可以

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<map>
  6. #include<vector>
  7. #include<queue>
  8. #include<malloc.h>
  9. using namespace std;
  10. #define L long long
  11. vector<int >q[1050];
  12. int val[2050];
  13. int vol[2050];
  14. int dp[1050];
  15. int n,m,w;
  16. int id[1050];
  17. vector<int >z[1050];
  18. void bfs(int u,int cnt){
  19. int sumval = 0;
  20. int sumvol = 0;
  21. queue<int>que;
  22. que.push(u);
  23. id[u] = cnt;
  24. sumval += val[u];
  25. sumvol += vol[u];
  26. z[cnt].push_back(u);
  27. while(!que.empty()){
  28. int f=que.front();que.pop();
  29. for(int i=0;i<q[f].size();i++){
  30. int v=q[f][i];
  31. if(id[v] == -1){
  32. z[cnt].push_back(v);
  33. sumval += val[v];
  34. sumvol += vol[v];
  35. id[v] = cnt;
  36. que.push(v);
  37. }
  38. }
  39. }
  40. val[cnt + n] = sumval;
  41. vol[cnt + n] = sumvol;
  42. z[cnt].push_back(n + cnt);
  43. }
  44. int main(){
  45. scanf("%d%d%d",&n,&m,&w);
  46. for(int i=1;i<=n;i++)scanf("%d",&vol[i]);
  47. for(int i=1;i<=n;i++)scanf("%d",&val[i]);
  48. for(int i=1;i<=n;i++)q[i].clear();
  49. memset(id,-1,sizeof(id));
  50. for(int i=1;i<=m;i++){
  51. int u,v;
  52. scanf("%d%d",&u,&v);
  53. q[u].push_back(v);
  54. q[v].push_back(u);
  55. }
  56. int cnt = 0;
  57. for(int i=1;i<=n;i++){
  58. if(id[i] == -1){
  59. cnt ++;
  60. z[cnt].clear();
  61. bfs(i,cnt);
  62. }
  63. }
  64. memset(dp,0,sizeof(dp));
  65. for(int i=1;i<=cnt;i++){
  66. for(int j=w;j>=0;j--){
  67. for(int k=0;k<z[i].size();k++){
  68. int d=z[i][k];
  69. if(j>=vol[d]){
  70. if(dp[j]<dp[j-vol[d]]+val[d]){
  71. dp[j]=dp[j-vol[d]]+val[d];
  72. }
  73. }
  74. }
  75. }
  76. }
  77. printf("%d\n",dp[w]);
  78. }

  

Codeforces Round #383 (Div. 2) D 分组背包的更多相关文章

  1. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

  2. Codeforces Round #383 (Div. 2) A,B,C,D 循环节,标记,暴力,并查集+分组背包

    A. Arpa’s hard exam and Mehrdad’s naive cheat time limit per test 1 second memory limit per test 256 ...

  3. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(分组背包+dsu)

    D. Arpa's weak amphitheater and Mehrdad's valuable Hoses Problem Description: Mehrdad wants to invit ...

  4. Codeforces Round #383(div 2)

    A.快速幂 B. 题意:求ai^aj=x的数对个数,x和a[]给定 分析:a^b=c,则a^c=b,所以求ai^x=aj的个数,枚举一遍即可 C. 题意:给你一个有向图,每个点的出边只有一条,求最小的 ...

  5. Codeforces Round #383 (Div. 2) D. Arpa's weak amphitheater and Mehrdad's valuable Hoses —— DP(01背包)

    题目链接:http://codeforces.com/contest/742/problem/D D. Arpa's weak amphitheater and Mehrdad's valuable ...

  6. Codeforces Round #383 (Div. 2)D. Arpa's weak amphitheater and Mehrdad's valuable Hoses(dp背包+并查集)

    题目链接 :http://codeforces.com/contest/742/problem/D 题意:给你n个女人的信息重量w和美丽度b,再给你m个关系,要求邀请的女人总重量不超过w 而且如果邀请 ...

  7. 01背包dp+并查集 Codeforces Round #383 (Div. 2)

    http://codeforces.com/contest/742/problem/D 题目大意:有n个人,每个人有重量wi和魅力值bi.然后又有m对朋友关系,朋友关系是传递的,如果a和b是朋友,b和 ...

  8. Codeforces Round #383 Div 1题解

    第一次打Div 1,感觉还是挺难的..把基础题打完就日常划水了.... [A. Arpa's loud Owf and Mehrdad's evil plan](http://codeforces.c ...

  9. Codeforces Round #383 (Div. 2) C. Arpa's loud Owf and Mehrdad's evil plan —— DFS找环

    题目链接:http://codeforces.com/contest/742/problem/C C. Arpa's loud Owf and Mehrdad's evil plan time lim ...

随机推荐

  1. Java NIO 系列教程

    http://www.iteye.com/magazines/132-Java-NIO

  2. poj 1192

    此题亦一眼看出算法,一次AC. 没什么好讲的,就是一个普通的树形动规. 用dp[n][0]表示n号顶点不取时的最大值,dp[n][1]表示n号顶点取时的最大值. dp[n][0]=max{dp[x][ ...

  3. 按Enter键执行表单验证

    document.onkeydown = function(evt){ var evt = window.event?window.event:evt; if (evt.keyCode==13) { ...

  4. R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记(转)

    https://ask.julyedu.com/question/7490 labelImg:https://github.com/tzutalin/labelImg

  5. oracle插入数据时解决和旧数据id的冲突

    我们在使用oracle创建一个主键的时候需要让他自增, 但是他跟mysql不同,需要创建序列,具体看下面: 可以删除之前创建的sequence,我们在重新创建一个: DROP SEQUENCE SJG ...

  6. 红黑树/B+树/AVL树

    RB Tree 红黑树  :http://blog.csdn.net/very_2/article/details/5722682 Nginx的RBTree实现   :http://blog.csdn ...

  7. 设置UITableView的separatorInset值为UIEdgeInsetsZero,分隔线不最左端显示的问题

    一.问题描述 UITableView分割线要显示到最左端 查看UITableView的属性,发现设置separatorInset的值可以自定义分割线的位置. @property (nonatomic) ...

  8. 【python】点分十进制ip与数字互转

    来源:http://www.cnblogs.com/vovlie/archive/2012/10/17/2727029.html 利用lambda表达式,非常简洁 int_to_ip = lambda ...

  9. python学习笔记(1)

    python简介 python是Guido van Rossum在圣诞节打发无聊的时间时候写出来的语言. python是解释性的语言. python是动态类型的语言. python是强类型定义语言(高 ...

  10. 简单理解Socket

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...