[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.hqwc.cn/news/660072.html

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

相关文章

逆向第一步 去掉debugger(无任何门槛小白可学习)

准备工具 1.ReRes 地址&#xff1a;ReRes 用法&#xff1a; 用法 2.nodepad 地址&#xff1a;nodepad 注意下载后缀为.x64.exe版本的 我这里下的npp.8.6.5.Installer.x64.exe 3给nodepad装上JSTool插件 下载 可省略下叙详细步骤点此链接直接下载 JSToolNpp 然后到导…

Cloudflare防火墙其他WAF设置

其他WAF设置 缓存设置 缓存设置好也可以帮助我们抵挡巨量的CC攻击。有些CC是很多IP随即攻击一个地址&#xff0c;如果我们的安全策略没有拦截到攻击。但是我们设置了缓存&#xff0c;那这些请求则会在CloudFlare边缘节点直接将缓存内容返回给请求。也达到了抗攻击的效果。 缓…

周三多《管理学原理》第3版/考研真题/章节练习题

普通高等教育“十一五”国家级规划教材《管理学原理》&#xff08;第3版&#xff0c;周三多、陈传明、龙静编著&#xff0c;南京大学出版社&#xff09;是我国高校广泛采用的管理学权威教材之一&#xff0c;也被众多高校&#xff08;包括科研机构&#xff09;指定为考研考博专业…

李廉洋:4.30美债收益率飙升,黄金原油会不会受影响。

在劳工成本指数上升1.2%&#xff0c;超过1.0%的市场预期后&#xff0c;美国国债收益率立即飙升。这显然表明劳动力市场吃紧&#xff0c;允许美联储在更长时间内维持较高利率。2年期美债收益率直接突破5%&#xff0c;最高至5.03%&#xff1b;10年期最高至4.66%&#xff1b;美元大…

【数据结构】顺序表专题

前言 本篇文章我们来进行有关顺序表的专题训练&#xff0c;让我们一起来看一下有关顺序表的算法题 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 &#x1f4dd;若有问题 评论区见 &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.移除…

Python 可以对数据进行哪些可视化?

Python 可视化 一、条形图&#xff08;或柱状图&#xff09; 1.代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pddf pd.DataFrame({County:[America,Canada,Australia,Germany,French,China],GDP:[80,30,70,80,60,75] })plt.bar(df[County],df[G…

Docker consul 的容器服务更新与发现

目录 一. consul 的相关知识 1 什么是注册与发现 2. 什么是 consul 3. zookeeper 和 consul 的区别 二. consul 部署 1. consul 服务器 2. registrator 服务器 三. consul-template 1. consul-template 的作用 2. consul-template 的具体部署运用 2.1 准备 templa…

容器的通俗讲解:轻松理解容器技术

文章目录 什么是容器&#xff1f;容器与虚拟机的区别容器如何工作&#xff1f;容器的优势容器的应用场景常见容器技术相关解决方案 在当今的软件开发领域&#xff0c;容器技术已经成为一种异常流行的技术&#xff0c;但对于初学者来说&#xff0c;容器究竟是什么以及它们如何工…

由于找不到msvcr80.dll,无法继续执行代码的解决方法

在日常使用电脑进行工作或娱乐时&#xff0c;您可能会遇到一个令人困惑的情况&#xff1a;屏幕上突然弹出一个错误提示&#xff0c;明确指出“msvcr80.dll文件丢失”&#xff0c;这个错误通常会导致某些应用程序无法正常运行。那么&#xff0c;当我们遇到这个问题时&#xff0c…

UE5像素流部署以及多实例部署(兼容ue4)

像素流部署请看我之前的文章就行&#xff0c;今天讲的是多实例部署 在这里可以配置多实例的数量 如果设置800端口 设置两个实例 那么就是800 801端口 我的个人显卡是4060TI,最多开三个

大数据分析与内存计算学习笔记

一、Scala编程初级实践 1.计算级数&#xff1a; 请用脚本的方式编程计算并输出下列级数的前n项之和Sn&#xff0c;直到Sn刚好大于或等于q为止&#xff0c;其中q为大于0的整数&#xff0c;其值通过键盘输入。&#xff08;不使用脚本执行方式可写Java代码转换成Scala代码执行&a…

通过ESXi主机和专业工具导出或导入虚拟机

关于导出虚拟机的用户场景 导出ESXi虚拟机是VMware内置功能之一&#xff0c;可用于数据迁移或作为ESXi备份解决方案。通常情况下&#xff0c;您可以将ESXi中的虚拟机导出为OVF模板&#xff0c;该模板可捕获虚拟机或虚拟设备的状态并存储在一个自包含的包中&#xff0c;其中磁盘…