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 ...
随机推荐
- 自动布局库--Masonry使用
参考资料(戳这里): > Masonry官网 > Masonry介绍与使用实践(快速上手Autolayout) > iOS 开发实践之 Auto Layout > Ma ...
- 如何配置阿里Maven镜像
1.下载maven的zip解压,官方下载地址为:http://maven.apache.org/download.cgi 选择需要下载maven的版本就好了 2.到下载的maven路径下,conf/s ...
- IDEA运行时报错(IDEA不识别新语法):Error:java: Compilation failed: internal java compiler error
File-->setting...-->Buil,Execution,Deployment-->Compiler-->Java Compiler中,改一下Module,我的原来 ...
- eclipse 中安装spring tool suite 插件100%成功率
自己曾在学习spring时,在eclipse EE中安装springsourceTool Suite插件浪费了很多时间,不管是离线,在线还是在eclipse marketplace中安装,尝试了许多方 ...
- 使用HTML5 canvas做地图(3)图片加载平移放大缩小
终于开始可以写代码了,手都开始痒了.这里的代码仅仅是在chrome检测过,我可以肯定的是IE10以下浏览器是行不通,我一直在考虑,是不是使用IE禁止看我的篇博客,就是这群使用IE的人,给我加了很多工作 ...
- 构建第一个Spring Boot2.0应用之Controller(三)
Controller控制器主要是接收浏览器请求.下面说一说@Controller注解和@RestController的区别: (1)@Controller类中的方法可以直接通过返回String跳转到j ...
- Java中对jsonArray的排序,使用的是Gson
使用Gson对json解析字符串,转化为json对象. 先上代码: 下面是main方法里面的代码 package testJava; import java.util.ArrayList; impor ...
- Java笔记--动态代理
Java动态代理 1.概念 代理: 有时我们并不想直接访问对象A,或者不能直接访问对象A.而是通过访问一个中间对象B,让中间对象B去访问A.这种方式就称为代理. 这里的对象A所属的类就为委托类,或者被 ...
- 利用expect实现自动化操作
管理机上需要安装expect包 yum -y install expect 1.定义主机ip [root@localhost ~]# cat ip.txt 192.168.1.12 192.168.1 ...
- 将腾讯视频客户端缓冲的文件转换为一个MP4格式文件
打开腾讯视频windows客户端,播放要下载的视频,逐步快进使其缓冲完毕: 按照下图所示,复制缓存路径: 在cmd.exe的界面中输入“cd C:\854456b6d5a187ff3c0f553918 ...