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. (已解决)Arduino mega2560 R3插在电脑上没有反应

           OK,话不多说.网上找了一些资料,感觉都说的不够清晰.自己琢磨了下,有了一个简单粗暴的方法. 步骤1:插上Arduino mega2560板子.没有反应. 步骤2:我的电脑-管理-设备管 ...

  2. (转载)C#线程优先级详解

    计算机中经常会有多个任务同时运行,其中总有一些看起来更紧急,更需要优先完成.比如我们现在有两个任务,一个任务是下载一部电影,另一个任务是检测用户的输入.显然及时响应用户操作应具有更高的优先级,因为我们 ...

  3. linux命令 ——目录

    开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.http://codingstan ...

  4. Netweaver工作进程的内存限制 VS CloudFoundry应用的内存限制

    Netweaver 一个会话进程能够在堆上申请的内存大小上限, 在事务码RZ11里查看参数abap/heap_area_dia: CloudFoundry 每个应用可以在manifest.yml里定义 ...

  5. nginx搭建流媒体服务器

    1.安装PCRE库 到www.pcre.org 下载pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.37 ./configure make ...

  6. 【转载】#229 - The Core Principles of Object-Oriented Programming

    As an object-oriented language, c# supports the three core principles of object-oriented programming ...

  7. bzoj3312: [Usaco2013 Nov]No Change

    题意: K个硬币,要买N个物品.K<=16,N<=1e5 给定买的顺序,即按顺序必须是一路买过去,当选定买的东西物品序列后,付出钱后,货主是不会找零钱的.现希望买完所需要的东西后,留下的钱 ...

  8. Spark性能优化——和shuffle搏斗

    Spark的性能分析和调优很有意思,今天再写一篇.主要话题是shuffle,当然也牵涉一些其他代码上的小把戏. 以前写过一篇文章,比较了几种不同场景的性能优化,包括portal的性能优化,web se ...

  9. Nginx+proxy实现简单的负载均衡

    环境说明:操作系统centos6.6 64位web操纵系统是:web1=192.168.10.10(LAMP) web2=192.168.10.11(LNMP),这里只是测试nginx实现负载均衡效果 ...

  10. slice 与 substring

    Array数组:slice() slice() : 截取 Array 的部分元素,然后返回一个新的Array. var arr = ['a', ' b', 'c', 'd', 'e', 'f', 'g ...