1 条题解

  • 0
    @ 2026-1-28 14:54:39
    #include<bits/stdc++.h>
    using namespace std;
    // [1] Node结构体:存储每个物品的重量w和价值p;arr数组:存储所有物品的信息
    struct Node{
    	int w,p;
    }arr[200];
    // [2] dp数组:动态规划数组,dp[j]表示背包容量为j时能装的最大价值
    int dp[20100]={};
    
    int main(){
        int maxw,n; // [3] maxw:背包的最大载重;n:物品的总数
    	cin>>maxw>>n; // [4] 读取背包最大载重和物品数量
    	// [5] 读取每个物品的重量和价值,存入arr数组
    	for(int i=0;i<n;i++) cin>>arr[i].w>>arr[i].p;
    	
    	// [6] 0-1背包核心逻辑:遍历每个物品,更新不同容量下的最大价值
    	for(int i=0;i<n;i++){// 外层循环:遍历每个物品
    		// 内层循环:逆序遍历背包容量,避免同一个物品被重复选取(0-1背包特性)
    		for(int j=maxw;j>=arr[i].w;j--){// 对容量从大到小讨论
    			// 递推式:容量j时的最大价值 = max(不选当前物品的原有值, 选当前物品后的值)
    			dp[j]=max(dp[j],dp[j-arr[i].w]+arr[i].p);
    		}
    	}
    	
    	// [7] 输出背包最大容量maxw下的最大价值
    	cout<<dp[maxw];
        return 0;
    }
    
    • 1

    信息

    ID
    1330
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者