CF 742D

题目:

背包

题解:

最近好烦啊……

这题就是俩背包,一个大的一个小的,要么做大的要么做小的……

心情不好……随手写写……

#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;
}

猜你喜欢

转载自blog.csdn.net/mengwuyaaa/article/details/80092362