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(分组背包)的更多相关文章

  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. 使用data-自定义数据及如何获取该值

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. python基本数据类型,int,bool,str

    一丶python基本数据类型 1.int 整数,主要用来进行数学运算. 2.str 字符串,可以保存少量数据并进行相应的操作 3.bool 判断真假.True.False 4.list 存储大量数据, ...

  3. Struts2笔记1

    一.简介 1.作用于web层:Struts2是一种基于MVC模式的轻量级Web框架; 2.各文件夹简介:     apps:该文件夹存用于存放官方提供的Struts2示例程序,这些程序可以作为学习者 ...

  4. Oracle Business Intelligence Enterprise Edition 12.2.1.2.0 Books

    Oracle Business Intelligence Enterprise Edition 12.2.1.2.0 Books Documentation for Oracle Business I ...

  5. Git 团队常用命令操作指南

    命令如下: git clone -b <branch name> [remote repository address] 主要就是在clone的时候,后面添加branch的信息. 报错: ...

  6. Entity Framework --Entity SQL注意事项

    Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...

  7. Samuraiwtf-的确是很好的渗透学习平台

    有人问我要渗透测试平台学习,我想到了Samurai ,记得里面带有很多的,这里来推广一下. Samurai Web 测试框架很多人说是live CD测试环境,但是现在似乎不是了,至少目前最新版的只有这 ...

  8. char*、string、CString各种字符串之间转换

    参考博客: http://blog.csdn.net/luoweifu/article/details/20242307 http://blog.csdn.net/luoweifu/article/d ...

  9. 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)

    点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...

  10. Python实现注册和登录

    一.注册账号需要实现的功能 1.输入:用户名,密码,密码确认 2.限制1:输入的账号和密码不能为空 3.限制2:两次输入密码必须一致 4.限制3:用户名不能重复 5.限制4:错误次数为4次 6.用字典 ...