1 条题解

  • 0
    @ 2026-1-27 20:15:39
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] n-物品的种类数;v-背包的总容积(最大可装体积)
    int n,v; 
    struct stu{
        // [2] m-第i种物品的单个体积;w-第i种物品的单个价值;s-第i种物品的最大数量
        int m,w,s;
    }arr[1100];  // [3] arr数组-存储每种物品的体积、价值、数量
    int dp[1100]={};  // [4] dp数组-动态规划状态,dp[k]表示容积为k的背包能装入的最大价值
    
    int main(){
        // 问题分析:多重背包问题,每种物品有体积、价值和数量限制,求容积V的背包能装的最大价值
        // 解题步骤:朴素三重循环实现(数据范围小,可通过),将每个物品拆成s个独立物品做01背包
        //          外层遍历物品,中间遍历物品数量,内层逆序遍历背包容量更新状态
        
        cin>>n>>v;  // [5] 读取物品种类数n和背包总容积v
        for(int i=1;i<=n;i++){
            cin>>arr[i].m>>arr[i].w>>arr[i].s;  // [6] 读取每种物品的体积、价值、数量
        }
        
        dp[0]=0;  // [7] 初始化:容积为0的背包价值为0
        // 遍历每一种物品
        for(int i=1;i<=n;i++){
            // 遍历该物品的可使用数量(1~s),等价于拆成s个独立物品做01背包
            for(int j=1;j<=arr[i].s;j++){
                // 逆序遍历背包容量(01背包核心,避免重复选取同一物品)
                for(int k=v;k>=arr[i].m;k--){
                    // [8] 状态转移:不选当前物品则dp[k]不变;选则取dp[k-物品体积]+物品价值,取最大值
                    dp[k]=max(dp[k],dp[k-arr[i].m]+arr[i].w);
                }
            }
        }
        cout<<dp[v];  // [9] 输出容积为v的背包能装入的最大价值
        return 0;
    }
    
    • 1

    信息

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