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 ...
随机推荐
- 记一次有关GET/POST请求的Debug经历
Bug描述: 电商网站, 产品列表页面,加入购物车按钮,当连续点击“加入购物车”按钮时,在MAC上的Safari上,只会有部分请求通过 Ajax 被发送出去,而在 Chrome/IE/Firefox ...
- Oracle数据的导入导出
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份. exp命令可以把数据从数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到数据库服务器中. 执行环境D ...
- Cocos2d-x v3.1 坐标系统(五)
Cocos2d-x v3.1 坐标系统(五) 为了能够更好的布局以及了解对象所在的位置,我们必须对Cocos2d-x中的坐标有详细的了解,本篇文章主要就是了解Cocos中用到的坐标系统.学过数学的人都 ...
- linux 链接的使用 创建和删除符号连接
1 . 使用方式 :ln [option] source_file dist_file -f 建立时,将同档案名删除. ...
- 平时对ES6的一些总结
1.Genertor中yield和Interator中的next方法 Genertor的yield是把这个函数变成分段的:Interator中的next也是一个一个执行的: function* f() ...
- 新建framework的bundle资源 图片资源被编译成了ttf后缀 解決
设置combine_hidpi_images为no
- 【mydigitallife.info】如何禁用Aero窗口自动最大化
Go to Control Panel. Click on Ease of Access link or Ease of Access Center icon. Select Change how y ...
- Codeforces Round #327 590B Chip 'n Dale Rescue Rangers(等效转换,二分)
t和可到达具有单调性,二分就不多说了.下面说下O(1)的做法,实际上是等效转换,因为答案一定存在,如果在t0之前,那么分解一下 直接按照只有v计算就可以了.反过来如果计算的结果大于t0,那么表示答案在 ...
- Codeforces Round #327 (Div. 2) B Rebranding(映射)
O(1)变换映射,最后一次性替换. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; char s[ ...
- hdu1150&&POJ1325 Machine Schedule---最小点覆盖
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1150 题目大意: 给你两台机器A和B,A机器有n种模式,B机器有m种模式,初始时都是0,现在给你k个 ...