动态规划问题一直以来都是利用空间换取时间。

动态规划问题一直以来最经典的就是 0 1背包问题 ,再有点难度就是 完全背包问题 以及多重背包问题

0-1背包问题

题目描述:有一个容量为 V 的背包,和一些物品。这些物品分别有两个属性,体积 w 和价值 v,每种物品只有一个。要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。

其实这问题刚接触是 我靠 一脸懵逼 这是考数学呀!!! 瞬间感觉干饭都不香了。
其实只需要考虑每个物品两种形式 在背包和没在背包在背包 和 没在背包在背包和没在背包

第一步 对于每一个物品,有两种结果:能装下或者不能装下。

第一,包的容量比物品体积小,装不下,这时的最大价值和前i-1个物品的最大价值是一样的。(就是说口袋太小了 放不进去 ,,但是物品价值 和口袋里的物品一样值钱)

第二,还有足够的容量装下该物品,但是装了不一定大于当前相同体积的最优价值,所以要进行比较。(就是说 口袋很大 还能放里面 ,,但是和已经有的物品比较 说不来值钱还是不值钱)

第二步 就是考虑边界条件(万一装把口袋撑破了 ,是不是啥都装不进去了)
dp[i][j]啥意思 这样定义 就是说 把i个物品 装进 背包容量为 j 的背包 达到最大RMB价值。
初始时: dp[0][j]=0 (0<=j<=V)
来翻译一下 就是说 开始 i为0 里面没有东西 是空口袋 但是 j 不变 因为 口袋本身容量就这样大,里面没有东西 自然就不值钱为0
第三步考虑变换过程 就是转移状态
第i个物品的体积为w,价值为v,则状态转移方程为
当 j<w 时 dp[i][j]= dp[i-1][j]; 翻译一下 就是说第i件东西装不下 ,而且最大价值不改变,也就是有i行 没i也行 价值没变,但是有i容量就过载了
当 j<=w dp[i][j]=max(dp [i-1][ j-l ist[i].w] + v, dp[i-1][j]);这段太长了
解释一下 就是说 dp[i][j] 的值 由装i前的一个决定 比如 已经装了3斤 现在要装5斤 那么装这5斤 得看3斤装后的状态 万一3斤装了没位置了 那就不用装5斤了 。
所与i的前一个 dp[i-1][j-list[i].w] 这里加入v就好比 能装下5 斤,后边理解为 比较原本最大价值 如果装了价值变小了 还不如不装,所以求最大值 看看那各价值最大

接下来下代码 也是最头疼的

最大值就这

int max(int a, int b)//取最大值函数
{return a > b ? a : b;
}

背包结构体 和dp

struct Thing
{int w;int v;
}list[101];int dp[101][1001];

终极main函数

int main()
{int s, n;//背包容量和物品总数while (scanf("%d%d", &s, &n) != EOF){for (int i = 1; i <= n; i++){scanf("%d%d", &list[i].w, &list[i].v);//读入每个物品的体积和价值}dp[0][0] = 0;for (int i = 1; i <= s; i++) dp[0][i] = INF;//初始化二维数组for (int i = 1; i <= n; i++)//循环每个物品,执行状态转移方程{for (int j = s; j >= list[i].w; j--){dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - list[i].w] + list[i].v);}for (int j = list[i].w - 1; j >= 0; j--){dp[i][j] = dp[i - 1][j];}}printf("%d\n", dp[n][s]);}return 0;
}

这里注意个问题 我是倒写

 for (int j = s; j >= list[i].w; j--)for (int j = list[i].w - 1; j >= 0; j--)

why why why 举手回答
那是因为 要求恰好装满背包时,把dp[0][0]设为0,其余dp[0][i]设为负无穷即可,这样只有恰好达到dp[n][s]时,dp[n][s]才为正值,所以 我们直接就认为 背包能装满s 容量 进而判断 当容量大于 i 间物品是就装入进去 , 来来 给画画

下节说说 用滚动数组优化问题 二维变一维

动态规划之 0-1 背包问题相关推荐

  1. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  2. 动态规划之0/1背包问题(动态规划入门)

    动态规划很早以前就接触过但是因为太晦涩难懂一下子到现在才开始真正的学习到其中的道理,0/1背包问题是动态规划的入门类问题 比较好理解 首先我们要知道动态规划是用于解决最优解的问题 它是一种思想而不是一 ...

  3. 【武汉理工大学计算机复试刷题】(C语言)动态规划求解0/1背包问题之求最大价值

    文章目录 题目描述 思路分析 代码 运行情况 输入文件 运行结果 发现的问题 题目描述 一个旅行者有一个最多能装M公斤的背包,现在有n件物品,它们的重星分别是W1,W2, - Wn,它们的价值分别为C ...

  4. 0/1背包问题——动态规划方法

    1.定义 动态规划:把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 2.求解步骤 (1)找到状态转化条件 (2)归纳状态转移方程 (3)定义初始条件值 3.实例解析--0/1背包 ...

  5. 动态规划——0/1背包问题(全网最细+图文解析)

    ✨动态规划--0/1背包问题(全网最细+图文解析) 作者介绍:

  6. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  7. 0/1背包问题-----动态规划求解

    问题描述 有n个物品和一个容量为c的背包,从n个物品中选取装包的物品.物品i的重量为w[i],价值为p[i].一个可行的背包装载是指,装包的物品总重量不超过背包的重量.一个最佳背包装载是指,物品总价值 ...

  8. 动态规划的用法——01背包问题

    动态规划的用法--01背包问题 问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi.vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案中的价值最大值. 限制条件: ...

  9. 动态规划——物品无限的背包问题

    动态规划--物品无限的背包问题 物品无限的背包问题.有nn种物品,每种均有无穷多个.第i种物品的体积为ViV_i,重量为WiW_i.选一些物品装到一个容量为CC的背包中,使得背包内物品在总体积不超过C ...

  10. 令人头疼的背包九讲(1)0/1背包问题

    点击上方"Jerry的算法和NLP",选择"星标"公众号       重磅干货,第一时间送达 背包问题是一个经典的动态规划模型.它既简单形象容易理解,又在某种程 ...

最新文章

  1. BZOJ 3626: [LNOI2014]LCA
  2. c++自定义的数据库类
  3. java 01入门 取数字_jmu-Java-01入门-取数字
  4. MicroProfile OpenAPI上的Swagger UI
  5. 工作144:时间戳格式化
  6. 返回值带头信息 php_php与Redis实现分布式锁
  7. 面向对象程序设计_Task5_Calculator1.5.0
  8. 如何将立创元器件封装库导入AD使用
  9. linux查看nginx昅 电视,PHP实现查询汉字笔画、笔画排序、笔画统计
  10. 下一跳配置的原则--ensp
  11. css中的flow-root属性
  12. Qt进阶-汉字转拼音/全拼
  13. 【不定期更新】游戏开发中的一些良好习惯与技术技巧
  14. windows embed sapi php,19.1 嵌入式SAPI
  15. nginx-rtmp 的部署
  16. oracle如何打开控制文件,看一看oracle控制文件里面的内容
  17. 数字图像处理与Python实现-图像信号处理-图像坏点修复
  18. 微信传文件又慢又限制大小?试试这3个免费在线传文件工具!
  19. 新手C语言之删除数组中的空格笔记
  20. 生产型WMS系统:库内管理功能设计

热门文章

  1. 如何用大数据软件确定宠物用品店铺选址
  2. 暴风雨已至!网易云音乐暂停IPO,上市受阻的背后!
  3. linux查看文件的特殊权限,linux文件的特殊权限及隐藏权限
  4. 从“健康码”到数字货币,我国金融科技正迈向新阶段
  5. android studio TCP客户端通讯
  6. 用什么软件抓cd音轨音质最好_什么APP听音乐好?
  7. 微信公众号(服务号)接入开发(2)之微信授权登陆
  8. 什么情况下JVM内存中的一个对象会被垃圾回收
  9. reactivex java_使用ReactiveX for Java进行Http调用
  10. 伦纳德·里德 《铅笔的故事》