多重背包问题与优化(裸题)(一)

简介: 多重背包问题与优化(裸题)

多重背包问题 I

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

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

数据范围:

image.png

输入样例:

4 5
1 2 3
2 4 1
3 4 3
4 5 2

输出样例:

10

思路分析

数据范围很小,暴力枚举即可,不需要过多操作,f[i][j] 代表的是只从前 i 件物品中选,且总体积不超过 j的价值最大值。

代码

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

代码优化

image.png

滚动数组

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

拷贝数组

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int f[N], g[N];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ )
    {
        int v, w, s;
        cin >> v >> w >> s;
        memcpy(g, f, sizeof f);
        for (int j = 0; j <= m; j ++ )
            for (int k = 0; k <= s && k * v <= j; k ++ )
                f[j] = max(f[j], g[j - k * v] + k * w);
    }
    cout << f[m] << endl;
    return 0;
}

逆循环优化

逆循环的优化方式和 01 背包的优化是相同的,原理也是一致的,对于体积逆序枚举即可实现,这样的优化方法可真正实现仅用一维数组表示二维变量:

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



目录
相关文章
|
编解码 iOS开发 开发者
App上架Apple App Store和Google Play流程
App上架Apple App Store和Google Play流程
481 2
|
弹性计算 监控 数据安全/隐私保护
阿里云ECS云监控界面
阿里云ECS云监控界面
1332 2
|
程序员 编译器 C语言
【c语言】c语言转义字符详解
【c语言】c语言转义字符详解
1350 1
|
机器学习/深度学习 人工智能 自动驾驶
人工智能的伦理困境:当机器学习遇见道德选择
在人工智能飞速发展的今天,技术的进步不仅带来了便利和效率,也引发了一系列伦理问题。本文将探讨AI在决策过程中面临的伦理挑战,以及如何通过设计、立法和教育等手段来解决这些问题。
309 3
|
机器学习/深度学习 人工智能 运维
运维的未来:自动化与人工智能的融合之路
【8月更文挑战第21天】在数字化浪潮中,运维领域正经历着前所未有的变革。本文探讨了自动化和人工智能技术如何重塑运维工作,提升效率与准确性,并预测了未来运维的发展方向。通过分析当前运维面临的挑战,我们揭示了自动化和AI技术带来的机遇,以及它们如何助力运维人员实现更高效的工作流程和决策制定。文章还讨论了这些技术可能对运维职业路径产生的影响,为读者提供了对未来运维趋势的深刻洞察。
358 0
|
机器学习/深度学习 人工智能 监控
如何利用机器学习提高人脸识别准确率
如何利用机器学习提高人脸识别准确率
476 1
|
机器学习/深度学习 传感器 监控
深度学习在智能交通系统中的应用与展望
传统的交通管理系统因为无法满足日益增长的交通需求,而逐渐暴露出种种问题。本文将探讨深度学习在智能交通系统中的应用,介绍其原理和优势,并展望未来深度学习技术在交通领域的发展前景。
531 25
|
机器学习/深度学习 人工智能 编解码
Midjourney应用场景、特点、生成图片带来影响
Midjourney应用场景、特点、生成图片带来影响
634 1
|
人工智能 Java 测试技术
开源上新|FunASR英文离线文件转写软件包发布
开源上新|FunASR英文离线文件转写软件包发布
|
JSON Android开发 数据格式
Flutter笔记:美工设计.导出视频到RIVE
Flutter笔记:美工设计.导出视频到RIVE
570 0