[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相当…

【树——数据结构】

文章目录 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…

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安装的…

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

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

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

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

数据结构:图

数据结构&#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;是用全体实数还是特定整数来描述…

普乐蛙景区vr体验馆VR游乐场设备身历其境体验

小编给大家推荐一款gao坪效产品【暗黑战车】&#xff0c;一次6人同乘&#xff0c;炫酷外观、强大性能和丰富内容适合各个年龄层客群&#xff0c;紧张刺激的VR体验让玩家沉浸在元宇宙的魅力中&#xff0c;无论是节假日还是平日&#xff0c;景区商场助力门店提高客流量和营收~ ◆…

苹果和OpenAI再续前缘,iOS 18会是颠覆级的吗?|TodayAI

据彭博社最新报道&#xff0c;苹果公司已经与人工智能领域的先锋企业OpenAI重启了对话&#xff0c;双方目前正在讨论一项可能的合作&#xff0c;以将OpenAI的生成式人工智能技术整合到苹果即将推出的iOS 18操作系统中。这一举措表明&#xff0c;苹果正加速其在人工智能技术上的…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

AI手机,走入小径分岔的花园

博尔赫斯在他的成名作《小径分岔的花园》里&#xff0c;描述了一种奇妙的世界观&#xff1a;一个可能性被选择之后&#xff0c;出现了许多不同的后世&#xff0c;许多不同的时间。 在现实世界中&#xff0c;选择不会如此神奇。但站在岔路口的抉择&#xff0c;也一定会带来结果的…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接&#xff1a; 角色&#xff1a;系统管理员 是否拥有权限&#xf…