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. Java中的continue语句——通过示例学习Java编程(12)

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=23 continue语句主要是用在循环代码块中.当 ...

  2. Flash图表控件FusionCharts调整图表百分比大小

    用户可以为图表的宽度和高度设置百分比值,用来替代绝对的像素值. 以百分比的方式调整图表,首先需要更新HTML代码,如下所示: <div id="chartContainer" ...

  3. OpenFirewall

    1.写一份json文件:将要添加防火墙例外的应用程序和端口写入到json文件中 2.打开防火墙,读取json文件添加例外 /// <summary> /// Firewall.xaml 的 ...

  4. 报错:Program "sh" not found in PATH

    参考原文:http://vin-mail.blog.163.com/blog/static/37895280201211932919513/ 如果你按照我的方法 先配置了cygwin的环境变量,在打开 ...

  5. Mybatis-Spring整合Spring

    因为 MyBatis 用 SqlSessionFactory 来创建 SqlSession ,SqlSessionFactoryBuilder 创建 SqlSessionFactory ,而在 Myb ...

  6. C# asp.net mvc 注解验证

    看代码,看注解,看懂了单词,没看懂意思. 今日只能专攻一下这项特性. 1.Remote 在看这个例子的时候 ,看了JsonResult 以及 JsonRequestBehavior.AllowGet解 ...

  7. 【洛谷2468】[SDOI2010] 粟粟的书架(二合一)

    点此看题面 大致题意: 问你选取一个矩形区间内至少几个数,才能使它们的和\(\ge H_i\). 二合一 根据数据范围,比较显然能看出它是一道二合一的题目. 对于第一种情况,\(R,C\le 200\ ...

  8. Mybatis-连接池与事务

    Mybatis 的连接池技术 Mybatis 将它自己的数据源分为三类: UNPOOLED 不使用连接池的数据源 POOLED 使用连接池的数据源 JNDI 使用 JNDI 实现的数据源 Mybati ...

  9. python_59_装饰器2

    #匿名函数,无函数名 calc=lambda x:x*3 print(calc(3)) sum=lambda x,y,z:x+y+z print(sum(1,2,3)) ''' 高阶函数 a:把一个函 ...

  10. flush caches