CSU 1326: The contest(分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326
题意:
n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时做出来,并且坑题具有传递性。(a和b一起做会坑、b和c会坑则a和c也会坑) 它们最多可以作出多少价值的题目。
分析:先用并查集,将组分出来,然后进行分组背包
注意F数组,数组开辟的大小应该为总价值的最大值,还有初始化别忘记了
以及j-pi[i]>=0
一维数组:
- #include<stdio.h>
- #include<math.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- #define LL long long
- const int MOD=;
- const int MN=;
- int father[MN];
- int num[MN][MN];
- int rank[MN];
- int f[MN];
- int val[MN],pi[MN];
- int vis[MN];
- int cnt[MN];
- void Make_set(int n)
- {
- for(int i=; i<=n; i++)
- {
- father[i]=i;
- }
- }
- int Find(int x)
- {
- if(x!=father[x])
- father[x]=Find(father[x]);
- return father[x];
- }
- void Union(int x,int y)
- {
- if(x==y) return ;
- father[x]=y;
- }
- int main()
- {
- int i,j,k,n,m;
- while(scanf("%d%d%d",&n,&m,&k)!=EOF)
- {
- Make_set(n);
- for(i=; i<=n; i++)
- {
- scanf("%d%d",&val[i],&pi[i]);
- }
- int a,b;
- for(i=; i<=k; i++)
- {
- scanf("%d%d",&a,&b);
- int x=Find(a);
- int y=Find(b);
- Union(x,y);
- }
- memset(vis,,sizeof(vis));
- for(i=; i<=n; i++)
- {
- int t=Find(i);
- vis[t]++;
- }
- int cas=;
- for(i=; i<=n; i++)
- {
- if(vis[i])
- {
- ++cas;
- int tes=;
- for(j=; j<=n; j++)
- {
- if(father[j]==i)
- num[cas][++tes]=j;
- }
- cnt[cas]=vis[i];
- }
- }
- memset(f,,sizeof(f));
- for(i=;i<=cas;i++)
- {
- for(j=m;j>=;j--)
- {
- for(k=;k<=cnt[i];k++)
- {
- int xx=num[i][k];
- if(j-pi[xx]>=) f[j]=max(f[j],f[j-pi[xx]]+val[xx]);
- }
- }
- }
- printf("%d\n",f[m]);
- }
- return ;
- }
二维数组:
循环取最大值的那里要小心,始终要和f[i-1][j]进行比较
- #include<stdio.h>
- #include<math.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- #define LL long long
- const int MOD=;
- const int MN=;
- int father[MN];
- int num[MN][MN];
- int rank[MN];
- int f[MN][MN];
- int val[MN],pi[MN];
- int vis[MN];
- int cnt[MN];
- void Make_set(int n)
- {
- for(int i=; i<=n; i++)
- {
- father[i]=i;
- }
- }
- int Find(int x)
- {
- if(x!=father[x])
- father[x]=Find(father[x]);
- return father[x];
- }
- void Union(int x,int y)
- {
- if(x==y) return ;
- father[x]=y;
- }
- int main()
- {
- int i,j,k,n,m;
- while(scanf("%d%d%d",&n,&m,&k)!=EOF)
- {
- Make_set(n);
- for(i=; i<=n; i++)
- {
- scanf("%d%d",&val[i],&pi[i]);
- }
- int a,b;
- for(i=; i<=k; i++)
- {
- scanf("%d%d",&a,&b);
- int x=Find(a);
- int y=Find(b);
- Union(x,y);
- }
- memset(vis,,sizeof(vis));
- for(i=; i<=n; i++)
- {
- int t=Find(i);
- vis[t]++;
- }
- int cas=;
- for(i=; i<=n; i++)
- {
- if(vis[i])
- {
- ++cas;
- int tes=;
- for(j=; j<=n; j++)
- {
- if(father[j]==i)
- num[cas][++tes]=j;
- }
- cnt[cas]=vis[i];
- }
- }
- memset(f,,sizeof(f));
- for(i=;i<=cas;i++)
- {
- for(j=m;j>=;j--)
- {
- for(k=;k<=cnt[i];k++)
- {
- int xx=num[i][k];
- if(j-pi[xx]>=)
- {
- f[i][j]=max(f[i][j],f[i-][j-pi[xx]]+val[xx]);
- f[i][j]=max(f[i-][j],f[i][j]);
- }
- else f[i][j]=max(f[i][j],f[i-][j]);
- }
- }
- }
- printf("%d\n",f[cas][m]);
- }
- return ;
- }
分组背包: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(分组背包)的更多相关文章
- csu 1326 The contest
裸的 并查集 + 分组背包: #include<iostream> #include<cstring> #include<algorithm> #inclu ...
- ACboy needs your help(HDU 1712 分组背包入门)
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- CSU 1326:The contest(并查集+分组背包)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:…… 思路:并查集建图处理出边,然后分组背包. 之前不会分组背包,比赛的时候也推不出来 ...
- 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 ...
- HDU 3033 分组背包变形(每种至少一个)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 1712 分组背包
ACboy needs your help Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU3535AreYouBusy[混合背包 分组背包]
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- I love sneakers!(分组背包HDU3033)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3535 AreYouBusy 分组背包
AreYouBusy Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
随机推荐
- Josn转换
也是搬的,大家勿喷,贴出来只为了自己记忆查找 需要引用 System.Web.Extensions.dll 这个类库 命名空间: System.Web.Script.Serialization 数据结 ...
- JVM虚拟机 - 内存
在JVM虚拟机中,内存部分大致可以分为以下几类: Heap:堆 NonHeap:非堆 CodeCache:缓存编辑后的机器码的内存区域 CompressedClassSpace:类压缩空间 MetaS ...
- iOS 基础笔试题
参考:https://www.jianshu.com/p/1d3496bc5bda 1.#import 跟#include.@class有什么区别?#import<> 跟 #import& ...
- Android中渐变图片失真的解决方案
在android开发(尤其是android游戏开发)中有一个很严重的问题就是带有渐变效果的png图片会出现严重的banding(色带),鉴于这种情况,有几种可行的解决方法: 1.如果Activit ...
- 不该被忽视的CoreJava细节(一)
一.系列文章导言 <不该被忽视的CoreJava细节>系列文章将会持续更新.我希望自己通过这一系列文章的写作,能与读者一起进步,逐步完善对Java体系结构的了解. 二.本期关注点 几乎翻看 ...
- javascript字符串格式化string.format
String.prototype.format = function () { var values = arguments; return this.replace(/\{(\d+)\}/g, fu ...
- spring boot 下 spring security 自定义登录配置与form-login属性详解
package zhet.sprintBoot; import org.springframework.beans.factory.annotation.Autowired;import org.sp ...
- 数据字典的设计--4.DOM对象的ajax应用
需求:点击下拉选项框,选择一个数据类型,在表单中自动显示该类型下所有的数据项的名称,即数据库中同一keyword对应的所有不重复的ddlName. 1.在dictionaryIndex.js ...
- jq动态增加的button标签click回调失效的问题,即动态增加的button标签绑定事件$("button.class").click(function)无效
对于新增加的页面元素,改变了页面结构,如果是使用老办法$("button.class").click(function)去监听新的button标签事件,会失效. 笔者的应用是文字的 ...
- Dll注入:Windows消息钩子注入
SetWindowsHook() 是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之 ...