[C++][算法基础]四种基本背包问题(动态规划)

1. 01背包问题

有 𝑁 件物品和一个容量是 𝑉 的背包。每件物品只能使用一次。

第 𝑖 件物品的体积是 𝑣𝑖,价值是 𝑤𝑖。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,𝑁,𝑉,用空格隔开,分别表示物品数量和背包容积。

接下来有 𝑁 行,每行两个整数 𝑣𝑖,𝑤𝑖,用空格隔开,分别表示第 𝑖 件物品的体积和价值。

输出格式

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

数据范围

0<𝑁,𝑉≤1000
0<𝑣𝑖,𝑤𝑖≤1000

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
8

代码:

1. 常规二维数组做法

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

2. 优化一维数组做法 

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

2. 完全背包问题

有 𝑁 种物品和一个容量是 𝑉 的背包,每种物品都有无限件可用。

第 𝑖 种物品的体积是 𝑣𝑖,价值是 𝑤𝑖。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,𝑁,𝑉,用空格隔开,分别表示物品种数和背包容积。

接下来有 𝑁 行,每行两个整数 𝑣𝑖,𝑤𝑖,用空格隔开,分别表示第 𝑖 种物品的体积和价值。

输出格式

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

数据范围

0<𝑁,𝑉≤1000
0<𝑣𝑖,𝑤𝑖≤1000

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

代码: 

1. 常规二维数组做法:

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

2. 优化一维数组做法:

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

3. 多重背包问题

有 𝑁 种物品和一个容量是 𝑉 的背包。

第 𝑖 种物品最多有 𝑠𝑖 件,每件体积是 𝑣𝑖,价值是 𝑤𝑖。

求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

输入格式

第一行两个整数,𝑁,𝑉,用空格隔开,分别表示物品种数和背包容积。

接下来有 𝑁 行,每行三个整数 𝑣𝑖,𝑤𝑖,𝑠𝑖,用空格隔开,分别表示第 𝑖 种物品的体积、价值和数量。

输出格式

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

数据范围

0<𝑁,𝑉≤100
0<𝑣𝑖,𝑤𝑖,𝑠𝑖≤100

输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10

代码:

1. 常规二维数组做法

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

2. 优化一维数组做法

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

4. 分组背包问题

有 𝑁 组物品和一个容量是 𝑉 的背包。

每组物品有若干个,同一组内的物品最多只能选一个。
每件物品的体积是 v_{ij},价值是 w_{ij},其中 𝑖 是组号,𝑗 是组内编号。

求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。

输出最大价值。

输入格式

第一行有两个整数 𝑁,𝑉,用空格隔开,分别表示物品组数和背包容量。

接下来有 𝑁 组数据:

  • 每组数据第一行有一个整数 s_{i},表示第 𝑖 个物品组的物品数量;
  • 每组数据接下来有 s_{i} 行,每行有两个整数 v_{ij},w_{ij},用空格隔开,分别表示第 𝑖 个物品组的第 𝑗 个物品的体积和价值;
输出格式

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

数据范围

0<𝑁,𝑉≤100
0<s_{i}≤100
0<v_{ij},w_{ij}≤100

输入样例
3 5
2
1 2
2 4
1
3 4
1
4 5
输出样例:
8

代码:

优化一维数组做法:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程&#xff08;API 可以认为是 应用层 和 传输层 之间交互的路径&#xff09;&#xff08;API:Socket API相当…

RK3399平台Android7系统编译及问题解决

目录 【Android系统编译】 平台&#xff1a; Android编译&#xff1a; 烧写固件路径&#xff1a; 【android版本号查看】 【RK3399开发环境搭建】 4.1 JDK 安装 4.2 Linux 服务器开发环境搭建 4.2.1 发布包使用 Linux 服务器系统版本 4.2.2 网络环境搭建 4.2.3 软件…

【树——数据结构】

文章目录 1.基本概念2.基本术语1.结点之间的关系描述2.结点&#xff0c;树的属性描述3.有序树&#xff0c;无序树4.森林 3.树的性质考点1考点2考点3考点4 4.树的存储结构5.树和森林的遍历 1.基本概念 结点&#xff0c;根节点&#xff0c;分支结点&#xff0c;叶子结点&#xf…

Redis系列-1 Redis介绍

背景&#xff1a; 本文介绍Redis相关知识&#xff0c;包括Redis的使用、单线程机制、事务、内存过期和淘汰机制。后续将在《三方件-3 Redis持久化机制》中介绍Redis基于RDB和AOF的持久化机制&#xff1b;在《三方件-4 Redis集群》介绍主从、哨兵和Cluster集群相关的内容&#…

python 11Pandas数据可视化实验

实验目的&#xff1a; 学会使用Pandas操作数据集&#xff0c;并进行可视化。 数据集描述&#xff1a; 该数据集是CNKI中与“中药毒理反应”相关的文献信息&#xff0c;包含文章题目、作者、来源&#xff08;出版社&#xff09;、摘要、发表时间等信息。 实验要求&#xff1…

Element对象

Element对象 Element是一个通用性非常强的基类&#xff0c;所有Document对象下的对象都继承自它&#xff0c;这个对象描述了所有相同种类的元素所普遍具有的方法和属性&#xff0c;一些接口继承自Element并且增加了一些额外功能的接口描述了具体的行为&#xff0c;例如HTMLEle…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…

Windows环境下基于CMake构建Lua

Windows环境下基于CMake构建Lua 环境&#xff01;&#xff01;&#xff01;注意&#xff1a; lua-5.4.6.tar.gz压缩包中&#xff0c;并未提供luac.c文件&#xff0c;无法构建luac.exe&#xff0c;可以从lua-5.4.5.tar.gz压缩包中拷贝使用 一、搭建基于CMake构建的Lua环境二、构…

Python-快速搭建一个管理平台

目录 &#x1f4dc; 准备工作 一、项目介绍 ✨ 二、制作数据库表 添加信息 ⚒️ 三、运行client.exe &#x1f680; 1、连接数据库&#xff0c;选择对应表&#xff0c;生成代码 2、把后端代码依次复制到项目中 3、把前端代码依次复制到前端项目中 4、添加路由 四、运行后端项目…

python生成随机字符串

随机字符的场景大致有以下场景&#xff1a; 1.产生随机字符串 无数字 2.产生随机长度的字符串 无数字、有数字 3.产生随机手机号 4.产生随机n位的数字 5.产生随机n以内的数字 随机使用的两种思路如下&#xff1a; 一&#xff1a;使用random.randint(0,n) 我们有一个包含…

《21天学通C++》(第十三章) 类型转换运算符

1.为什么需要类型转换&#xff1f; ①兼容不同类型&#xff1a; 在C中不同类型的数据不能直接进行运算&#xff0c;如需要则要进行类型转换 ②指针转换&#xff1a; 在处理指针时&#xff0c;经常需要把一个类型的指针转化为另一个类型的指针 ③与C语言兼容&#xff1a; C兼…

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

【信息系统项目管理师知识点速记】进度管理:排列活动顺序

10.5 排列活动顺序 排列活动顺序是识别和记录项目活动之间关系的过程,主要作用是定义工作之间的逻辑顺序,以在既定的所有项目制约因素下获得最高的效率。本过程需要在整个项目期间开展。 10.5.1 输入 项目管理计划: 进度管理计划:规定了排列活动顺序的方法、准确度和其他…

数据结构:图

数据结构&#xff1a;图 前言 在自动化程序分析中&#xff0c;图和树的一些算法起到了至关重要的作用&#xff0c;所以在开始自动化程序分析的研究前&#xff0c;我用了两天复习了一遍数据结构中的图。本章主要内容有图的基本概念&#xff0c;图的存储和图相关的经典算法&…

OpenCV(二)—— 车牌定位

从本篇文章开始我们进入 OpenCV 的 Demo 实战。首先&#xff0c;我们会用接下来的三篇文章介绍车牌识别 Demo。 1、概述 识别图片中的车牌号码需要经过三步&#xff1a; 车牌定位&#xff1a;从整张图片中识别出牌照&#xff0c;主要操作包括对原图进行预处理、把车牌从整图…

数据结构--顺序表经典OJ题

例1&#xff1a;合并有序顺序表 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff…

测试开发工具开发 -JMeter 函数二次开发

在JMeter中开发自定义函数是一个常见的需求&#xff0c;允许我们扩展JMeter的功能以适应特定的测试需求。自定义函数可以用来处理数据&#xff0c;生成输出&#xff0c;或者执行特定的运算。通过JMeter函数二次开发可以帮我们解决实际测试过程中造数难的问题 用过JMeter的同学…

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类&#xff0c;它继承了AbstractOwnableSynchronizer&#xff0c;实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

信号与线性系统 1绪论

信号 信号是随时间变化的某种物理量&#xff08;狭义&#xff09; 本课程中&#xff0c;信号用 函数&#xff08;而且是一维函数&#xff09;表示 连续 离散 信号分类 确定与随机&#xff1a;是否能以确定的时间函数表示离散与连续&#xff1a;是用全体实数还是特定整数来描述…