1 solutions

  • 0
    @ 2025-3-3 16:21:28

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    
    int f[10100];//存储物品之间的关系
    int q[10100],v[10100];//价钱、价值
    int dp[10100];//以拥有的钱来定义背包容量 
    
    //查:查询元素的根 
    int find(int x){
    	return f[x]==x?x:f[x]=find(f[x]);
    } 
    
    //并:合并元素xy
    void merge(int x,int y){
    	int fx = find(x);
    	int fy = find(y);
    	if(fx != fy){
    		f[fx] = fy;
    	}
    } 
    
    int main() {
    	int n,m,w;
    	cin>>n>>m>>w;
    	//n个物品的价钱和价值
    	for(int i = 1;i <= n;i++){
    		cin>>q[i]>>v[i];
    		//并查集初始化
    		f[i] = i; 
    	} 
    	
    	//m个物品的关系
    	int x,y;
    	for(int i = 1;i <= m;i++){
    		cin>>x>>y;
    		merge(x,y);
    	} 
    	
    	//将有关系的物品合并到这组物品的根上 
    	for(int i = 1;i <= n;i++){
    		//该物品不是根,则将价钱和价值都合并到根上 
    		if(f[i] != i){
    			q[find(i)]+=q[i];
    			v[find(i)]+=v[i];
    			//将该组物品的价钱和价值清零
    			q[i]=0;
    			v[i]=0; 
    		}
    	} 
    	
    	//01背包计算结果
    	for(int i = 1;i <= n;i++){
    		//从背包容量(有多少钱)~该物品的价钱降序 
    		for(int j = w;j >= q[i];j--){
    			dp[j] = max(dp[j],dp[j-q[i]]+v[i]);
    		}
    	} 
    	
    	cout<<dp[w];
    	
    	return 0;
    }
    
    • 1

    Information

    ID
    9970
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By