算法修炼之筑基篇——筑基一层初期(解决01背包问题)

news/2024/10/31 3:22:00/

✨博主:命运之光

专栏:算法修炼之练气篇​​​​​

博主的其他文章:点击进入博主的主页

前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期难度可谓是天差地别,懂得都懂,题目难度相比起练气期的题目难度提升很多,所以要是各位蒟蒻小伙伴们看不懂筑基期的题目可以在练气期多积累积累,练气期的题目也会不断更新,大家一定要把基础打牢固了再来看筑基期的题目哈,这样子也可以提高大家的学习效率,一举两得,加油(●'◡'●)🎉🎉

目录

✨经典的01背包问题

🍓小明的背包1 

🍓解题代码

🍓dp数组打表如下:

​编辑 ✨经典01背包问题的解题思路

✨01背包的递推公式(重要需要记忆)

✨01背包的递推公式优化为一维数组(重要需要记忆)


✨经典的01背包问题

让我们先看一道经典的01背包问题

🍓小明的背包1 

 

🍓解题代码

#include<bits/stdc++.h>
using namespace std;
int wi[105],vi[105],dp[1005][1005];
int main()
{int n,v;//n为行数,v为背包的大小cin>>n>>v;//传入n,v的值for(int i=1;i<=n;i++){cin>>wi[i]>>vi[i];//传入重量和价值 }//写dp数组int i,j;for(i=1;i<=n;i++){for(j=1;j<=v;j++){if(j<wi[i]){dp[i][j]=dp[i-1][j];//如果重量没j大的话,就直接继承dp数组上一列的最优解,直接dp[i-1][j]即可 }else{//若是比j大则进行比较,这道题标准的01背包问题,直接套用01背包推出的公式即可 dp[i][j]=max(dp[i-1][j],dp[i-1][j-wi[i]]+vi[i]);	} }} cout<<dp[n][v];return 0;
}

🍓dp数组打表如下:

 ✨经典01背包问题的解题思路

在C/C++中,可以使用动态规划来解决01背包问题。动态规划是一种常用的解决优化问题的算法思想,它通过将问题分解为子问题,并利用子问题的解来构建更大规模的问题的解。

以下是使用动态规划解决01背包问题的基本步骤:

  1. 定义问题:我们需要确定背包的容量和物品的重量和价值。假设背包的容量为C,有n个物品,每个物品的重量为w[i],价值为v[i]。

  2. 创建一个二维数组dp[n+1][C+1],其中dp[i][j]表示在前i个物品中,背包容量为j时的最大价值。

  3. 初始化边界条件:当物品数量为0或背包容量为0时,最大价值都为0,即dp[i][0] = dp[0][j] = 0。

  4. 递推关系:对于每个物品i,我们有两种选择:放入背包或不放入背包。如果选择放入背包,那么当前的最大价值为dp[i][j] = dp[i-1][j-w[i]] + v[i];如果选择不放入背包,那么当前的最大价值为dp[i][j] = dp[i-1][j]。我们选择两者中的较大值作为dp[i][j]的值。

  5. 递推计算:使用循环遍历物品和背包容量,根据递推关系计算dp[i][j]的值。

  6. 返回结果:dp[n][C]即为问题的解,表示在前n个物品中,背包容量为C时的最大价值。

🍓下面是一个示例代码,演示了如何使用动态规划解决01背包问题:

#include <iostream>
using namespace std;int knapsack(int C, int weights[], int values[], int n) {int dp[n + 1][C + 1];// 初始化边界条件for (int i = 0; i <= n; i++)dp[i][0] = 0;for (int j = 0; j <= C; j++)dp[0][j] = 0;// 计算最大价值for (int i = 1; i <= n; i++) {for (int j = 1; j <= C; j++) {if (weights[i - 1] <= j) {dp[i][j] = max(values[i - 1] + dp[i - 1][j - weights[i - 1]], dp[i - 1][j]);} else {dp[i][j] = dp[i - 1][j];}}}return dp[n][C];
}int main() {int C = 10;  // 背包容量int weights[] = {2, 3, 4, 5};  // 物品重量int values[] = {3, 4, 5, 6};   // 物品价值int n = sizeof(weights) / sizeof(weights[0]);  // 物品数量int max_value = knapsack(C, weights, values, n);cout << "最大价值:" << max_value << endl;return 0;
}

在这个示例中,背包的容量C为10,有4个物品,重量分别为2、3、4和5,价值分别为3、4、5和6。运行程序将输出最大价值为10,即当背包容量为10时,从这些物品中选择可以得到的最大价值。你可以根据实际情况修改输入的背包容量、物品重量和价值,来解决不同的01背包问题。

✨01背包的递推公式(重要需要记忆)

dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])

其中,dp[i][j]表示在前i个物品中,背包容量为j时的最大价值,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。

递推公式的含义是,在考虑第i个物品时,我们有两种选择:

  1. 不选择第i个物品,即仅考虑前i-1个物品,此时的最大价值为dp[i-1][j]
  2. 选择第i个物品,那么背包的容量就会减少,变为j-w[i],此时的最大价值为dp[i-1][j-w[i]] + v[i],即在考虑前i-1个物品、背包容量为j-w[i]时的最大价值,再加上第i个物品的价值v[i]。

我们选择上述两种选择中的较大值作为dp[i][j]的值,即表示在考虑前i个物品、背包容量为j时的最大价值。

需要注意的是,上述递推公式中的dp数组是一个二维数组,大小为(n+1) x (C+1),其中n表示物品的数量,C表示背包的容量。初始化时,需要设置边界条件,即dp[0][j] = dp[i][0] = 0,表示当物品数量为0或背包容量为0时的最大价值为0。

✨01背包的递推公式优化为一维数组(重要需要记忆)

dp[j] = max(dp[j], dp[j-w[i]] + v[i])

其中,dp[j]表示背包容量为j时的最大价值,w[i]表示第i个物品的重量,v[i]表示第i个物品的价值。


http://www.ppmy.cn/news/265507.html

相关文章

论证有效性分析专题[1] – 因果关系的可靠性

专题[1] – 因果关系的可靠性 求因果的方法包括&#xff1a;求同法、求异法、求同求异共用法、共变法、剩余法。剩余法的典型案例就是居里夫人发现镭的过程&#xff0c;居里夫人发现在沥青之中发现放射元素的放射量远远超出已知元素的放射量&#xff0c;那么把已知元素提炼出来…

Linux:DHCP服务

我的DHCP服务器 是 centos7 使用的yum安装DHCP服务&#xff08;如果不会搭建yum库可以查看&#xff09; Linux&#xff1a;rpm查询安装 && yum安装_鲍海超-GNUBHCkalitarro的博客-CSDN博客 我的环境为&#xff1a; 两台centos7一台win10 第一台centos7 为 DHCP服务器…

谷歌浏览器翻译修复工具

http://www.wangbaochao.com/blog/article/189

2023最新谷歌翻译修复

1、修改host: 进入etc文件夹&#xff0c;找到host文件 mac&#xff1a;右键访达—前往文件夹–输入“etc/hosts” windows&#xff1a; C:\Windows\System32\drivers\etc 2、利用链接找到translate的ip网址并填入最下面 3、保存后修改成功重新打开Google即可&#xff01; 链接…

注册表清理软件测试自学,注册表检测及修复工具(RegClean Pro)

注意&#xff1a;该软件下载安装之后会有附带捆绑软件下载&#xff0c;请大家注意&#xff0c;可以通过卸载工具自行卸载&#xff01; 注册表检测及修复工具(RegClean Pro)软件是一款免费使用且非常专业的系统优化软件。注册表检测及修复工具(RegClean Pro)界面简洁明晰、操作方…

Win10系统修复工具(联想win10系统修复工具)+资源

该修复工具由联想制作&#xff0c;资源包中包括四个工具&#xff0c;用于修复win10系统部分bug。 &#xff08;资源去主页上传的资源查看&#xff0c;我不知道为啥发布的资源要vip&#xff0c;没有vip的可以私信我&#xff0c;我把文件发给你&#xff09; 第一个是Win10预装应…

QTranslate翻译工具

CtrlQ全局翻译&#xff0c;中文英文自己识别&#xff0c;指哪打哪可以说&#xff0c;目前翻译有些许延迟&#xff0c;句子也可以翻译&#xff0c;差了点意思。单词的查询速度挺快的&#xff0c;网站页面&#xff0c;各种文件里面都能正常使用。当然也可以考虑使用有道&#xff…

修复谷歌浏览器翻译功能(win10)

1.进入路径&#xff1a;C:\Windows\System32\drivers\etc\hosts 2.用记事本打开hosts文件 3.在文件末尾加入142.250.0.90 translate.googleapis.com&#xff1b;格式为&#xff1a;特定IP地址空一格translate.googleapis.com 4.重启谷歌浏览器 注&#xff1a;若上述操作之后…