题目:
背包
题解:
最近好烦啊……
这题就是俩背包,一个大的一个小的,要么做大的要么做小的……
心情不好……随手写写……
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct Bag{
int weight,beauty,vis,in;
}bag[1010];
struct Node{
int weight,beauty,vis,num;
}node[1010];
int dp[1010][1010];
int n,m,w;
int allweight=0;
int allbeauty=0;
int allnum=0;
int bit=1;
vector<int> vec[1010];
void dfs(int x){
bag[x].vis=true;
bag[x].in=bit;
allweight+=bag[x].weight;
allbeauty+=bag[x].beauty;
allnum++;
for(int i=0;i<vec[x].size();i++){
int to=vec[x][i];
if(!bag[to].vis)
dfs(vec[x][i]);
}
}
bool cmp(Bag a,Bag b){
return a.in<b.in;
}
int main(){
for(int i=0;i<1010;i++){
bag[i].vis=0;
node[i].vis=0;
node[i].num=0;
}
memset(dp,0,sizeof(dp));
cin>>n>>m>>w;
for(int i=1;i<=n;i++) cin>>bag[i].weight;
for(int i=1;i<=n;i++) cin>>bag[i].beauty;
while(m--){
int a,b;
cin>>a>>b;
vec[a].push_back(b);
vec[b].push_back(a);
}
for(int i=1;i<=n;i++){
if(!bag[i].vis){
dfs(i);
node[bit].weight = allweight;
node[bit].beauty = allbeauty;
node[bit].num = allnum;
allweight = 0;
allbeauty = 0;
allnum = 0;
bit++;
}
}
sort(bag+1,bag+n+1,cmp);
int k=1;
for(int i=1;i<bit;i++){
for(int j=0;j<1010;j++){
dp[i][j]=max(dp[i][j],dp[i-1][j]);
if(j-node[i].weight>=0){
dp[i][j]=max(dp[i][j],dp[i-1][j-node[i].weight]+node[i].beauty);
}
}
for(;k<=n;k++){
if(bag[k].in!=i) break;
for(int j=0;j<1010;j++){
if(j-bag[k].weight>=0){
dp[i][j]=max(dp[i][j],dp[i-1][j-bag[k].weight]+bag[k].beauty);
}
}
}
}
cout<<dp[bit-1][w]<<endl;
}