背包问题合集

简介: 背包问题合集

目录

🍔01背包

🍔完全背包

🍔01背包变形问题

🍔分组背包


⭐01背包

循环体积(第二层循环)时从大向小循环

⭐完全背包

循环体积(第二层循环)时从小向大循环

15.1.png背包问题其实可以作为模板背下来

01背包

2. 01背包问题 - AcWing题库

有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

image.png

#include <iostream>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N];
int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) cin >> v[i] >> w[i];
    for(int i = 1; i <= n; i++) {
        for(int j = m; j >= v[i]; j--){
            f[j] = max(f[j], f[j-v[i]]+w[i]);
        }
    }
    cout << f[m] << endl;
    return 0;    
}

完全背包

3. 完全背包问题 - AcWing题库

有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。

第 i种物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 种物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

image.png

⭐分析

1、s(i,j)   = max (s(i-1,j), s(i-1,j-v)+w, s(i-1,j-2v)+2w ...)//一个物品可以取多次
2、s(i,j-v) = max (s(i-1,j-v), s(i-1,j-2v)+w ...)  // 注意没有 +w
1 和 2 合并后可得
s(i,j) = max (s(i-1,j), s(i,j-v)+w )

🚥🚥🚥🚥🚥🚥

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N];
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    for (int i = 1; i <= n; i ++ )
        for (int j = v[i]; j <= m; j ++ )
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[m] << endl;
    return 0;
}

01背包变形问题

4. 多重背包问题 I - AcWing题库

有 N 种物品和一个容量是 V的背包。

第 i 种物品最多有 si件,每件体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。

输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。

接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。

输出格式

输出一个整数,表示最大价值。

🍔🍔🍔

这道题是01背包的变形

既然是01背包,那么第二层循环就要从大向小循环

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int v[N],w[N],s[N];
int dp[N];
int main()
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; i++)  cin >> v[i] >> w[i] >> s[i];
    for(int i = 1 ;i <= n; i++)
    {
        for(int j = m; j >= v[i] ; j--)
        {
            for(int k = 1; k <= s[i] && k * v[i] <= j; k ++)//控制个数
            {
                dp[j] = max(dp[j], dp[j- k * v[i]] + k * w[i]);
            }
        }
    }
    cout << dp[m] << endl;
    return 0;
}

分组背包

9. 分组背包问题 - AcWing题库

有 N组物品和一个容量是 V 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。

每件物品的体积是 v[i][j],价值是 w[i][j],其中 i 是组号,j 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。

接下来有 N组数据:

每组数据第一行有一个整数 Si,表示第 i 个物品组的物品数量;

每组数据接下来有 Si行,每行有两个整数 v[i][j],w[i][j],用空格隔开,分别表示第 i 个物品组的第 j 个物品的体积和价值;

输出格式

输出一个整数,表示最大价值。

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int f[N];
int v[N][N],w[N][N],s[N];
int n,m,k;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>s[i];
        for(int j=0;j<s[i];j++){
            cin>>v[i][j]>>w[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=m;j>=0;j--){
            for(int k=0;k<s[i];k++){    //for(int k=s[i];k>=1;k--)也可以
                if(j>=v[i][k])     f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);  
            }
        }
    }
    cout<<f[m]<<endl;
}

Code over!

相关文章
|
XML 编解码 前端开发
【web组件库系列】封装自己的字体图标库
【web组件库系列】封装自己的字体图标库
514 0
|
5月前
|
安全 Cloud Native Serverless
2025数字员工技术选型白皮书:阿里云/亚马逊等5款产品云原生能力实测
本文深度评测阿里云、亚马逊、科大讯飞、玄晶引擎、安恒五款数字员工,围绕架构兼容性、开发友好度、性能稳定性三大维度,结合实测数据与企业案例,为开发者提供选型指南与避坑建议。
700 5
|
7月前
|
人工智能 安全 搜索推荐
AI的下一个前沿:从静态工具到动态代理
AI的下一个前沿:从静态工具到动态代理
375 113
|
编解码 边缘计算 5G
2025年12月 UU 云电脑测评
随着5G、云 computing 技术的发展,远程游戏有望成为未来娱乐的重要形态。当前远程工具的优化方向,已经从“能玩”向“玩好”转变。未来,随着AV1编码、边缘计算等技术的普及,远程游戏的延迟有望进一步降低,画质和兼容性也将持续提升,“低配设备畅玩3A游戏”的目标将更加容易实现。
2025年12月 UU 云电脑测评
|
9月前
|
JSON API 数据格式
小红书笔记详情API,json数据返回
以下是一个模拟的小红书笔记详情的JSON数据返回示例,包含了笔记的基本信息、作者信息、内容、图片、标签以及互动数据(点赞、评论、收藏)等关键字段:
|
存储 安全 大数据
阿里云存储:优缺点深度剖析
阿里云存储是国内领先的云存储服务,具备高效稳定、弹性可扩展、安全可靠及丰富的产品线等优点,适用于各种规模的企业。其分布式架构支持高并发和大数据处理,提供多层次的安全防护和灵活的存储方案。然而,成本较高、数据安全风险和网络连接稳定性等问题也需关注。用户应根据需求权衡利弊,选择合适的存储方案。
1307 74
|
传感器 网络协议 物联网
《分布式软总线:重塑应用开发工作量格局》
分布式软总线是一种颠覆性技术,显著简化了跨设备应用开发。它通过自发现、统一接口封装和连接资源管理,融合Wi-Fi、蓝牙等通信技术,让设备自动识别与连接,无需开发者深究底层细节。其异构组网能力支持多设备灵活拓扑,传输功能满足多种数据需求。相比传统模式需耗费大量时间处理底层代码与适配问题,分布式软总线大幅减少工作量,使开发者能专注于业务逻辑优化,提升效率、降低成本,推动跨设备协同应用进入高效智能新时代。
377 3
|
Python
[python]将多张图片合并为单个pdf文件
[python]将多张图片合并为单个pdf文件
542 0
|
机器学习/深度学习 自然语言处理 语音技术
迁移学习(Transfer Learning)
迁移学习是一种机器学习技术,通过将一个任务中学到的知识应用于另一个相关任务,有效解决了数据稀缺和计算资源有限的问题。它涉及预训练模型、特征提取、微调、领域适应等多种技术,广泛应用于计算机视觉、自然语言处理等领域,显著提升了模型的泛化能力和新任务的性能。
|
人工智能 测试技术
ChatExcel--自动处理表格
ChatExcel--自动处理表格
890 1
ChatExcel--自动处理表格