codeforces 741B
2017-08-22 21:24
211 查看
题目大意:
有n个人,每个人都有对应的value值和weight值, 并且每个人都有自己的朋友圈,这个朋友圈的人要不全部参加party,否则至多只有一个人可以参加;
题目分析:
分组背包,顺带处理所有人都参加的情况;
一个朋友圈就是一个分组,使用并查集可以很简单的完成分组的过程
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#define N 1005
#define M 1000005
using namespace std;
int a
,b
,w
,f[M];
int find(int x)
{
if (x==a[x]) return x;
else return a[x]=find(a[x]);
}
void make(int x,int y)
{
a[find(x)]=find(y);
}
int main()
{
int n,m,W,x,y;
scanf("%d%d%d",&n,&m,&W);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
for (int i=1;i<=n;i++) a[i]=i;
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
make(x,y);
}
vector<int>G
;
for (int i=1;i<=n;i++) G[find(i)].push_back(i);
for (int i=1;i<=n;i++){
if (find(i)!=i) continue;
for (int j=W;j>=0;j--){
int sum1=0,sum2=0;
for (int k=0;k<G[i].size();k++){
sum1+=w[G[i][k]];
sum2+=b[G[i][k]];
if(j>=w[G[i][k]]) f[j]=max(f[j],f[j-w[G[i][k]]]+b[G[i][k]]);
}
if (j>=sum1) f[j]=max(f[j],f[j-sum1]+sum2);
}
}
printf("%d",f[W]);
return 0;
}
有n个人,每个人都有对应的value值和weight值, 并且每个人都有自己的朋友圈,这个朋友圈的人要不全部参加party,否则至多只有一个人可以参加;
题目分析:
分组背包,顺带处理所有人都参加的情况;
一个朋友圈就是一个分组,使用并查集可以很简单的完成分组的过程
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
#define N 1005
#define M 1000005
using namespace std;
int a
,b
,w
,f[M];
int find(int x)
{
if (x==a[x]) return x;
else return a[x]=find(a[x]);
}
void make(int x,int y)
{
a[find(x)]=find(y);
}
int main()
{
int n,m,W,x,y;
scanf("%d%d%d",&n,&m,&W);
for (int i=1;i<=n;i++) scanf("%d",&w[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
for (int i=1;i<=n;i++) a[i]=i;
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
make(x,y);
}
vector<int>G
;
for (int i=1;i<=n;i++) G[find(i)].push_back(i);
for (int i=1;i<=n;i++){
if (find(i)!=i) continue;
for (int j=W;j>=0;j--){
int sum1=0,sum2=0;
for (int k=0;k<G[i].size();k++){
sum1+=w[G[i][k]];
sum2+=b[G[i][k]];
if(j>=w[G[i][k]]) f[j]=max(f[j],f[j-w[G[i][k]]]+b[G[i][k]]);
}
if (j>=sum1) f[j]=max(f[j],f[j-sum1]+sum2);
}
}
printf("%d",f[W]);
return 0;
}
相关文章推荐
- Codeforces 741B 并查集+dp
- codeforces 741B
- Codeforces 741B-Arpa's weak amphitheater and Mehrdad's valuable Hoses
- codeforces 12A - Super Agent
- codeforces 546E 分类: codeforces 2015-05-27 20:33 36人阅读 评论(0) 收藏
- CodeForces - 672D Robin Hood (二分)好题
- CodeForces 586D Phillip and Trains (基础搜索 -- DFS)
- codeforces 450B Jzzhu and Sequences
- CodeForces 305 D.Olya and Graph(组合数学)
- CodeForces 690 D2.The Wall (medium)(组合数学)
- codeforces 304A. Pythagorean Theorem II
- codeforces 185a(矩阵快速幂)
- CodeForces 66BPetya and Countryside
- Codeforces 180C Letter【dp】
- 【Codeforces】834C. The Meaningless Game
- CodeForces 336 D.Vasily the Bear and Beautiful Strings(组合数学)
- Codeforces-55D - Beautiful numbers - 数位DP
- codeforces 314C Sereja and Subsequences(树状数组+DP)
- 解题报告 之 CodeForces 91B Queue
- [Codeforces] Round #353 (Div. 2)