秋招算法——背包模型——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;

}
分析总结
  • 这里要明白最大值、最小值和装载货物数量之间的关系。
  • 同时还要记住这是一个模板题,记住模板就是会做。
相关推荐
NAGNIP5 小时前
万字长文!回归模型最全讲解!
算法·面试
知乎的哥廷根数学学派5 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
666HZ6666 小时前
数据结构2.0 线性表
c语言·数据结构·算法
实心儿儿7 小时前
Linux —— 基础开发工具5
linux·运维·算法
charlie1145141918 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
清木铎9 小时前
leetcode_day4_筑基期_《绝境求生》
算法
清木铎9 小时前
leetcode_day10_筑基期_《绝境求生》
算法
j_jiajia9 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法
源代码•宸10 小时前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
Jasmine_llq11 小时前
《CF280C Game on Tree》
数据结构·算法·邻接表·深度优先搜索(dfs)·树的遍历 + 线性累加统计