首页 > 其他分享 >基础背包问题

基础背包问题

时间:2024-06-18 23:11:21浏览次数:16  
标签:std 背包 dp2 dp1 int 基础 问题 物品

01背包

有N种物品,第i种物品的体积是v[i],价值是w[i],每件物品最多只能选1件。有一个容量为V的背包,问将哪些物品装入背包,可使这些物品的总体积不超过背包,并且总价值最大,输出最大价值。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    int N, V;
    std::cin >> N >> V;
    std::vector<int> v(N+1), w(N+1);
    for (int i = 1; i <= N; i++) {
        std::cin >> v[i] >> w[i];
    }
    std::vector<int> dp1(V+1), dp2(V+1);
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= V; j++) {
            dp2[j] = dp1[j];
            if (j >= v[i]) {
                dp2[j] = std::max(dp2[j], w[i]+dp1[j-v[i]]);
            }
        }
        std::swap(dp1, dp2);
    }
    std::cout << dp1[V] << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

完全背包

有N种物品,第i种物品的体积是v[i],价值是w[i],每种物品都有无数多件。有一个容量为V的背包,问将哪些物品装入背包,可使这些物品的总体积不超过背包,并且总价值最大,输出最大价值。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    int N, V;
    std::cin >> N >> V;
    std::vector<int> v(N+1), w(N+1);
    for (int i = 1; i <= N; i++) {
        std::cin >> v[i] >> w[i];
    }
    std::vector<int> dp1(V+1), dp2(V+1);
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= V; j++) {
            dp2[j] = dp1[j];
            if (j >= v[i]) {
                dp2[j] = std::max(dp2[j], w[i]+dp2[j-v[i]]);
            }
        }
        std::swap(dp1, dp2);
    }
    std::cout << dp1[V] << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

多重背包

有N种物品,第i种物品的体积是v[i],价值是w[i],共有s[i]件。有一个容量为V的背包,问将哪些物品装入背包,可使这些物品的总体积不超过背包,并且总价值最大,输出最大价值。

#include <bits/stdc++.h>
using i64 = long long;

void solve() {
    int N, V;
    std::cin >> N >> V;
    std::vector<int> nv{0};
    std::vector<int> nw{0};
    for (int i = 0; i < N; i++) {
        int v, w, s;
        std::cin >> v >> w >> s;
        for (int i = 1; s > i; i *= 2) {
            nv.push_back(i * v);
            nw.push_back(i * w);
            s -= i;
        }
        nv.push_back(s * v);
        nw.push_back(s * w);
    }
    int nn = nv.size() - 1;
    std::vector<int> dp1(V+1), dp2(V+1);
    for (int i = 1; i <= nn; i++) {
        for (int j = 1; j <= V; j++) {
            dp2[j] = dp1[j];
            if (j >= nv[i]) {
                dp2[j] = std::max(dp2[j], nw[i]+dp1[j-nv[i]]);
            }
        }
        std::swap(dp1, dp2);
    }
    std::cout << dp1[V] << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:std,背包,dp2,dp1,int,基础,问题,物品
From: https://www.cnblogs.com/chenfy27/p/18255366

相关文章

  • 【鸿蒙开发教程】HarmonyOS NEXT对于游戏类App的基础支持
    前言根据研究机构CounterpointResearch发布的最新数据,2024年第一季度,鸿蒙OS份额由去年一季度的8%上涨至17%,iOS份额则从20%下降至16%。这意味着,华为鸿蒙OS在中国市场的份额超越苹果iOS,已成中国第二大操作系统随着鸿蒙市场份额的不断提升,相应的岗位也会迎来一个爆发式的......
  • 数据库基础操作学习记录(附代码讲解)
    首先是创建表格,可以用代码也可以直接用鼠标右键。然后就可以进行数据插入和主码设置,下面是设置主码。设置CPXSB表的客户编号为主码。接下来是这次的学习内容:    这个是用代码查找CPXSB表中前一千行的方法,其实可以直接用鼠标右键查看。SELECTTOP1000[产品编号......
  • 跟我从零开始学C++(C++代码基础)2
    引言在上一章我们下载了学习C++的工具,VisualStudio编译器,也学习了一些简单基础的语法,知道了一些C++的相关的背景知识,还有C++的语法基础,我们这节课就来接着学习有关C++的内容。本章的内容有运算符和表达式,以及控制结构。编写我们的第一个代码Helloworld!不论是是学习什么......
  • java基础·小白入门(一)
    目录Java语言概述Java的性质三种平台跨平台原理Java语言开发环境相关概念Java开发工具的安装Java程序的编译与运行基本注意事项Java语言基础数据类型基本数据类型引用数据类型关键字与标识符常量与变量常量变量数据类型转换常见运算符Java语言概述这一部分主要......
  • redis——基础服务
    首先为什么要做一个redis出来?数据库不够用了吗?考虑到原本的应用程序是客户端访问服务端,服务端访问业务数据需要去数据库去拿,而数据库是个持久化的应用程序,是需要磁盘IO的,这就导致了速度会慢,并且如果存在大量的访问,会导致数据库崩溃。除去导致崩溃这样严重且极端的情况,这点性能虽然......
  • python系列&AI系列:cannot import name ‘ForkProcess‘ from ‘multiprocessing.conte
    cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决问题描述问题原因解决方案cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问......
  • 【接口自动化测试】第一节.接口自动化测试基础和框架介绍
    文章目录前言一、接口自动化基础   1.1接口自动化基础介绍   1.2接口自动化测试流程   1.3选取自动化测试用例   1.4搭建自动化测试环境二、接口自动化测试框架   2.1接口自动化框架设计思路   2.2定义项目目录结构总结前......
  • 计算机图形学入门13:纹理映射常见问题、MipMap
        上一章介绍了纹理映射,这一章介绍纹理映射常见的问题。1.纹理太小 1.1产生原因        例如要渲染一面墙,它的分辨率4K,但与它对应的纹理大小是256x256,这样要怎样?显然纹理会被拉大。当墙面上一个点去查询纹理时,可能查询到不准确的值,如下:        ......
  • 马尔可夫链赌徒输光问题
    参考:https://wenku.baidu.com/view/c72af31a598102d276a20029bd64783e09127d24.html马尔可夫链,因安德烈马尔可夫(A.A.Markov,1856-1922)得名,是数学中具有马尔可夫性质的离散事件随机过程。该过程中,过去的状态(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无......
  • Python编程基础:f-字符串格式
    本文探讨使用Pythonf-字符串格式,也称为“格式化字符串文字”。f-string是格式化字符串的一种很好且简单的方法,适用于Pythonv3.6+。如果你仍然使用.format()方法,必须了解f-字符串。使用字符串格式的优势之一是能够“插入”并格式化字符串数据中的变量。Python字符串format()方......