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

菏泽软件定制开发文大侠seo博客

菏泽软件定制开发,文大侠seo博客,国内最大的网页模板网站,整人关不掉的网站怎么做背包问题 前言小明的背包思路详解满分代码 后续例题(待更新) 前言 起初我真的真的觉得动态规划是非常难的东西 以至于到现在我才鼓起勇气去真正的学它 但其实只要我们沉下心来分析 知道我们每一步要干嘛 好像也没有那么的难以理解了 其实我倒觉得 从最直…

背包问题

  • 前言
  • 小明的背包
    • 思路详解
      • 满分代码
  • 后续例题(待更新)

前言

起初我真的真的觉得动态规划是非常难的东西 以至于到现在我才鼓起勇气去真正的学它 但其实只要我们沉下心来分析 知道我们每一步要干嘛 好像也没有那么的难以理解了 其实我倒觉得
从最直白的DFS——>记忆化搜索(用一个memo[ ]数组来减少不必要的计算)——>dp数组(背包问题)
我觉得这是一个比较好的路径 但可惜我并没有花很多时间去练习 以至于有些DFS我都AC不了 但好在都能及时改正 现在看来真的是得益于合理的学习路径和优质的视频讲解 感恩
等过一段时间我会把所有东西都做一个开源 以供后续0基础读者能够安稳的起步
不为什么 只想把前辈们给我打的伞传递下去!

小明的背包

在这里插入图片描述

题目链接

思路详解

可以说这是一个非常经典的背包问题 需要借助我们的dp(Dynamic Programming)来解决
没什么难的 只不过是你还不知道

  • 1 首先我们需要明确 在这题里面什么是状态和选择

状态是可能变化的量 即包的剩余容量以及可以选择的物品
选择就是引起状态改变的量 即拿或者不拿 当前的物品

  • 2 其次我们需要明确我们dp数组的定义

什么是dp数组 就是我们用这个数组来表达某一种状态
例如 在这题中dp[3][2]=6 他的意思就是说
如果只考虑前三件物品 在背包容量为2的情况下 可以拿到的最大价值是6
我的理解:
可以与数学里面的线性规划来理解 就像是有两个限制(两条线)
而你需要找到在这个限制之下的函数最值F(x)可能我说的不够准确 但是我确实是这么来理解的
同时这意味着 :
我们dp数组的维度也就是dp后面跟几个方括号 [ ] 跟我们的状态有关 也就是说 这些状态的变化会引起最值的波动

好了 那么这题中 dp[i][w] 的定义就是:
对于前i件物品 当背包容量为w时的最大价值

  • 3 最后我们需要根据状态写出状态转移方程
  • 我们无非就是两个选择 选或者不选

1.不选 我们根据这题dp数组的定义就是 :

即对于当前这件物品的价值不用考虑 但前i-1件物品还是在包里的
所以:对于前i件物品 我们不装i 当背包容量为w时的最大价值为:

dp[i][w]=dp[i-1][w]

2.选 (难点)
选的话 假设包的容量够放当前的物品
那么首先 在最终价值当中 肯定包含第i件物品 即val[i]
其次 我们只需要知道在剩余的背包容量为w-wt[i](总的容量减去第i件物品的容量)情况下前i-1件物品的最大价值是多少
因此我们可以再次根据dp数组的定义得到:

dp[i-1][w-wt[i]]

想要知道当前状态下的最大价值dp[i][w] 我们只需要对上述求个和就可以 即:

dp[i][w]=dp[i-1][w-wt[i]]+val[i]

那么这道题就迎刃而解了

视频资源(必看):

对于动态规划的核心思路

满分代码

需要调整的细节就是我们遍历的起点是1 而wt和val的起始下标是从0开始的 所以在循环中 wt数组和val数组需要进行偏移1
另外 这个work函数实际上并不需要任何参数 如果你把n和v定义成全局变量 我只不过调试的时候给他加到main函数里了
其余的完全就是按照上面的思路来的

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int wt[N],val[N];
int dp[N][N];
int work(int n,int v)
{//遍历所有组合 for(int i=1;i<=n;i++){for(int w=1;w<=v;w++){//当前状态下装不下第i件物品 只能选择不装if(w-wt[i-1]<0){dp[i][w]=dp[i-1][w];}else{dp[i][w]=max(dp[i-1][w],dp[i-1][w-wt[i-1]]+val[i-1]);//取最优 因为要考虑性价比问题 }}}return dp[n][v];
}
int main()
{int n,v;cin>>n>>v;for(int i=0;i<n;i++){cin>>wt[i]>>val[i];}memset(dp,0,sizeof(dp));//初始化 //basecase dp[0][w]=0 dp[i][0]=0int res=work(n,v);cout<<res<<endl;return 0;
}

后续例题(待更新)

http://www.dtcms.com/wzjs/478834.html

相关文章:

  • 西安网站搭建的公司免费推广的平台
  • 做网站推广哪些湖南关键词优化快速
  • 华人代购网站开发广州seo网站服务公司
  • 珠海市网站建设怎么样黑帽seo论坛
  • 郑州专业网站优化快速建站网站
  • 怎样进行网站推广竞价推广渠道
  • 东莞网站制作个性化快速排名seo软件
  • 南京微网站开发电商的推广方式有哪些
  • 常州专业网站建设公司网站推广优化怎样
  • 商标在线注册平台文军seo
  • 网站源码怎么做seo搜索引擎优化方法
  • 怎样建网站赚钱seo关键字排名
  • 西安网站挂标怎么制作一个网站5个网页
  • python做网站项目学生网页制作成品
  • 西宁网站制作哪家好网站域名查询官网
  • 企业网站如何做seo郑州关键词排名外包
  • html制作一个个人主页网站江小白网络营销案例
  • 提供网站建设电话武汉seo软件
  • 网站建设用户调研网站申请
  • 怎样做网站亮照亮标百度平台官网
  • 宁波市网站集约化建设通知视频广告
  • 域名对网站排名的影响搜索引擎优化策略应该包括
  • 做网站开发有什么专业证成品短视频软件大全下载手机版
  • 菏泽做网站多少钱nba西部排名
  • 已注册域名怎么做网站呢王通seo教程
  • jsp可以做网站首页吗抖音关键词推广怎么做
  • 招工做哪个网站惠州seo快速排名
  • 品牌建设促进中心郑州优化网站公司
  • 福州企业网站建设哪家好seo排名优化公司
  • 线上做笔记的网站市场调研一般怎么做