分组背包问题与背包问题求具体方案(一)

简介: AcWing算法提高课内容,本文讲解 动态规划

前言

AcWing算法提高课内容,本文讲解 动态规划

本篇包括以下题目:

⭐️ AcWing 12. 背包问题求具体方案

⭐️ AcWing 9. 分组背包问题

⭐️ AcWing 1013. 机器分配

⭐️ AcWing 734. 能量石


写博客有哪里不完善的地方或者有哪里表达错误希望大家提出来,博主会立即改正!望大家海涵


本文需要先自修基础:背包问题


注:本文中的所有代码全部为优化后的代码,且不提供优化解释,解释请见:背包问题,其中有详细的解释

背包问题求具体方案

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

输出一行,包含若干个用空格隔开的整数,表示最优解中所选物品的编号序列,且该编号序列的字典序最小。

物品编号范围是 1 … N 。

数据范围:

image.png

输入样例:

4 5
1 2
2 4
3 4
4 6

输出样例:

1 4

思路分析

注意,因为要求输出的顺序是按照字典序,故我们在进行dp的过程中,枚举样本需要从大到小枚举,这样我们在按照字典序输出的时候就可以正向循环,查看状态i是由哪个状态j转移而来的 ( j > i )

代码

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

分组背包问题

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

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

数据范围:

image.png

输入样例:

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

输出样例:

8

思路分析

裸题,不解释,解释见博客:背包问题

代码

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




目录
相关文章
|
机器学习/深度学习 人工智能 项目管理
【机器学习】集成学习——Stacking模型融合(理论+图解)
【机器学习】集成学习——Stacking模型融合(理论+图解)
6150 1
【机器学习】集成学习——Stacking模型融合(理论+图解)
|
编解码
Blender视图渲染知识
Blender视图渲染知识
Blender视图渲染知识
|
安全 测试技术
网站CSRF跨站漏洞修复方案
CSRF通俗来讲就是跨站伪造请求攻击,英文Cross-Site Request Forgery,在近几年的网站安全威胁排列中排前三,跨站攻击利用的是网站的用户在登陆的状态下,在用户不知不觉的情况下执行恶意代码以及执行网站的权限操作,CSRF窃取不了用户的数据,只能执行用户能操作的一些数据。比如在用户不知道的情况下, 把账户里的金额,以及银行卡号,体现功能,都转移到其他人账户里去。如果被攻击者是一个管理员的权限,那么就会对网站安全构成严重的危害。
1522 0
网站CSRF跨站漏洞修复方案
|
SQL JSON Java
IntelliJ IDEA 15款 神级超级牛逼插件推荐
IntelliJ IDEA 15款 神级超级牛逼插件推荐
5949 1
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
533 0
|
Ubuntu Linux
在嵌入式系统中加载nfs(包含nfs server 端的安装)
在嵌入式系统中加载nfs(包含nfs server 端的安装)
478 0
|
数据可视化
DataV 7.0升级详解(3)-- 三个补救小妙招
在DataV 7.0 升级中,新增了三个补救功能:「回收站」「历史记录」「快照管理-可回滚」
DataV 7.0升级详解(3)-- 三个补救小妙招
|
机器学习/深度学习 存储 人工智能
搜广推模型构建及应用-AI架构师成长计划(二)|学习笔记
快速学习搜广推模型构建及应用-AI 架构师成长计划(二)。
2170 0
搜广推模型构建及应用-AI架构师成长计划(二)|学习笔记
|
数据采集 Web App开发 JSON
Python爬虫系列1-通过requests Payload方式抓取掘金数据
在给同事抓取个人文章数据的时候发现get形式获取不到数据,通过分析网站结构发现需要Post请求的json格式数据;进而发现其使用的Post格式并不是Form Data 而是Request Payload ,再解决之际,顺手写成博客供大家学习使用,如有帮助-还请点赞👍关注!将持续更新更多新的文章。
1391 0
Python爬虫系列1-通过requests Payload方式抓取掘金数据