当前位置: 首页 > news >正文

1267:【例9.11】01背包问题(信奥一本通)

题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

今天刚看完卡尔大哥讲解的01背包,今天手敲了一遍,还是很多问题,只能说自己还是刷题太少或者说是没理解到位。

代码如下

# include <iostream>
# include <cstring>
using namespace std;
int dp[1010][1010]; //1.dp[i][j] 表示着在有限的容量内使背包里面物品价值总和最大 
// 2.dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i])
int w[200], c[200];
int main()
{int m, n; //w[i]是重量, c[i]是物品的价值 cin>>m>>n;memset(dp, 0, sizeof(dp));for(int i = 1; i <= n; i++){cin>>w[i]>>c[i];}for(int j = w[0]; j <= m; j++)  //3.初始化行和列 {dp[0][j] = c[0];}for(int j = 1; j <= m; j++) //4.遍历顺序{for(int i = 1; i <= n; i++){if(w[i] > j){dp[i][j] = dp[i - 1][j];}else{dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i]);}}}//for(int i = 0; i <= n; i++) //打印二维dp数组//{//   for(int j = 0; j <= m; j++)//    {//        cout<<dp[i][j]<<" ";//    }//    cout<<endl;//}cout<<dp[n][m]<<endl;  //打印dp结果,如果错误的话,需要自己打印二维dp,如上return 0;
}

代码讲解:只讲核心。先确定dp[i][j]的含义,正如我解释所说的,dp[i][j]表示着在有限的容量内使背包里面物品价值总和最大。然后就根据这个含义定义好dp[i][j]的状态转移方程,dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i]),为什么是max而不是min,也很好理解,也就是我们需要求最大的价值,所以就要用max。其实是初始化,就是对于首行和首列初始化,为什么要初始化这两个,因为后面的dp是从上面dp[i - 1][j]和左上角dp[i - 1][j - x]来的,然后就是遍历顺序,这个遍历顺序一定要搞清楚顺序,为什么第一层是j而不是i,因为是先遍历背包,在遍历物品(当然,你先遍历物品,在遍历背包是一样的)所以dp[i][j]后面的[j]也就是背包(列),所以先遍历j,最后输出的是dp[n][m],值得注意的是,我们最好把数组定义为局部变量,这样自动初始化为0,要当作成员变量的话,如果你没初始化,那你的数组就是一串乱值。

感悟:因为以前看过信奥这个团队讲解的这个题目,我今天又按照自己的思路编写了这个代码,实际上我还发现这个团队有一点没讲到位,就是初始化这一知识点,那个团队没有写这个初始化代码,虽说这个题目不需要这一段代码也能过,但是也是很必要写上的,毕竟对于我们这种开始学习动态规划的小白来说,最好是写上。

http://www.lryc.cn/news/442066.html

相关文章:

  • 信息化时代下的高标准农田灌区:变革与机遇并存
  • 【系统架构设计师-2013年真题】案例分析-答案及详解
  • git merge如何忽略部分路径
  • spring boot导入多个配置文件
  • 硬件工程师笔试面试——无线通讯模块
  • 开源PHP免费家谱应用Webtrees简介
  • kafka消息发送几种方式
  • K1计划100%收购 MariaDB; TDSQL成为腾讯云核心战略产品; Oracle@AWS/Google/Azure发布
  • Kyutai 开源对话模型 Moshi;李飞飞空间智能公司已筹集超过 2.3 亿美元丨 RTE 开发者日报
  • Go语言的io输入输出流
  • 表单里面input的type属性值有哪些?
  • 【Redis】之Geo
  • 常用的k8s容器网络模式有哪些?
  • 4位整数的数位和
  • XHTML学习
  • KTH7823——16 位高精度低延时霍尔磁编码器可编程 ABZ 和 PWM 输出模式角度传感器
  • JDBC笔记
  • 小众语言ruby在苹果中的初步应用
  • Nature: 一种基于宏基因组序列空间生成无参考的蛋白质家族的计算方法
  • play-with-docker使用指南
  • 常见中间件漏洞靶场(tomcat)
  • 一文读懂SpringCLoud
  • tcpdump使用方法
  • 密码字典txt python密码字典代码
  • ubuntu安装emqx
  • F28335 时钟及控制系统
  • 数据结构和算法之线性结构
  • 3. 轴指令(omron 机器自动化控制器)——>MC_MoveAbsolute
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核启动】