秋招算法——背包模型——423采药问题——模板:背包问题

文章目录

题目描述
思路分析
  • 这里明显是使用背包问题,所以这里参考一下背包这个模板题的内容
  • 这个是朴素版的模板,没有经过代码的优化
cpp 复制代码
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1100;
const int V = 1100;
int n,v;  // 分别表示背包物体的数量和背包的容量
int f[N][V];  // 这个是状态转移矩阵
int vs[N];  // 不同物体的容量矩阵
int ws1[N];  // 不同物体的价值矩阵

int main(){
    cin>>n>>v;
    for(int i = 1 ;i <= n;i ++){
        cin>>vs[i]>>ws1[i];
    }
    // 这里需要迭代两次进行计算
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= v ; ++j) {
            f[i][j] = max(f[i -1][j],f[i][j]);
            if (j >= vs[i])
                f[i][j] = max(f[i][j],f[i - 1][j - vs[i]] + ws1[i]);    
        }
        
    }
}
  • 下述是经过优化之后的模板
    • 主要是使用了滚动数组,并且优化了空间之后的操作
cpp 复制代码
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1100;
const int V = 1100;
int n,v;
int f[N];
int vs[N];
int ws1[N];

int main(){
    cin>>n>>v;
    for(int i = 1 ;i <= n;i ++){
        cin>>vs[i]>>ws1[i];
    }

    for (int i = 1; i <= n; ++i) {
        for (int j = v; j >= 0 && j >= vs[i]; --j) {
                f[j] = max(f[j],f[j - vs[i]] + ws1[i]);
        }

    }

    cout<<f[v];
}

背包问题总共有三种,分别是求最大值、最小值和方案数量

实现代码
cpp 复制代码
// 组合数问题
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;
const int M = 11000;
int f[M],g[N];

int main(){
    int n, m;
    cin>>n>>m;
    for(int i = 1;i <= n;i ++) cin>>g[i];
    f[0] = 1;
    for (int i = 1; i <= n; ++i) {
        for (int j = m; j >= 1 && j >= g[i]; --j) {
//            f[j] = max(f[j],f[j - g[i]] + g[i]);
            f[j] = f[j] + f[j - g[i]];
        }
    }
    cout<<f[m]<<endl;

}
分析总结
  • 这里要明白最大值、最小值和装载货物数量之间的关系。
  • 同时还要记住这是一个模板题,记住模板就是会做。
相关推荐
Omics Pro19 分钟前
反式感知虚拟细胞!超越线性序列
数据库·人工智能·算法·机器学习·自然语言处理
-dzk-22 分钟前
【动态规划】LC 152.乘积最大子数组
算法·动态规划
积流成海24 分钟前
一致性哈希原理与实现:分布式系统负载均衡
算法·负载均衡·哈希算法·哈希函数·盘子工具站
Nil20811 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.13 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.13 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791314 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂14 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
光影少年14 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法
HEJOO914 小时前
Linux 设备驱动系列——使用全局工作队列
java·linux·算法