AcWing 4. 多重背包问题

文章目录

前言

完全背包问题和多重背包问题的区别是,完全背包问题是可以选择的商品是无数的,多重背包问题是商品的件数是有限制的。还有前面的 01 背包问题,每一件商品的件数是 1 件。

代码

cpp 复制代码
#include<iostream>
#include<algorithm>

using namespace std;

int n,m;
const int N=110;

int v[N],w[N],s[N];
int f[N][N];

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d%d%d",&v[i],&w[i],&s[i]);
    }
    
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            for(int k=0;k<=s[i]&&k*v[i]<=j;k++){
                f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
            }
        }
    }
    
    printf("%d\n",f[n][m]);
    return 0;
}

思路

v 表示的是体积,w 表示的是价值, s 表示的是商品件数的限制,f 是一个二维数组,第一维表示选择前面 i 个物品,第二维表示最大的体积不超过 j ,这个数组的属性是背包能容纳最大的价值。

第一层循环表示的是枚举每一件商品,第二层循环是枚举背包的体积,从小到大枚举,这里有一个需要注意的地方,前面的循环变量是从 1 开始计算的。是为了防止数组越界。因为我们需要有一个 i-1 ,这里是一个让步,曲线救国的方法。假设我们选了 k 件 i 这个物品,然后我们现在把这 k 件物品拿出背包,拿出了之后就相当于只选了前面 i-1 件商品,这个时候的最大值就是 f[i-1][j-k*v] ,然后我们再把这个 k 件商品放进背包,那么价值就是再加上 k*w ,就达到了我们的状态转移。还有我们还有一个最大值是,前面那个商品就是最大价值了,就是放 k 个物品的价值比不过前面的那次选择。好吧,其实还是有一点点想不清楚。

打卡

今天卧推 62.5 ,这个月的目标是 62.5 ,下个月目标是 65

相关推荐
努力学算法的蒟蒻14 小时前
day46(12.27)——leetcode面试经典150
算法·leetcode·面试
问道飞鱼15 小时前
【Rust编程语言】Rust数据类型全面解析
开发语言·后端·rust·数据类型
Blockbuater_drug15 小时前
InChIKey: 分子的“化学身份证”,从哈希原理到全球监管合规(2025)
算法·哈希算法·inchikey·rdkit·分子表达·化学信息学
会飞的胖达喵15 小时前
Qt自动信号槽连接机制:深入解析与应用实践
开发语言·qt
橙汁味的风15 小时前
2EM算法详解
人工智能·算法·机器学习
无奈笑天下15 小时前
银河麒麟V10虚拟机安装vmtools报错:/bin/bash解释器错误, 权限不够
linux·运维·服务器·开发语言·经验分享·bash
superman超哥15 小时前
仓颉动态特性探索:反射API的原理、实战与性能权衡
开发语言·后端·仓颉编程语言·仓颉·仓颉语言·仓颉动态特性·反射api
维构lbs智能定位15 小时前
北斗卫星导航定位从核心框架到定位流程详解(一)
算法·北斗卫星导航定位系统
byzh_rc15 小时前
[算法设计与分析-从入门到入土] 动态规划
算法·动态规划
程序员阿鹏15 小时前
@Autowired和@Resource的区别
java·开发语言·spring