给大家附上一个题目吧,便于理解

ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。

输入:每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v

接下来的n行,每行2个正整数,用空格隔开,分别代表苹果的大小c和价钱w

01背包其实就是遍历所有可能情况  然后取最优的结果   和搜索差不多 不过比搜索快

0 1 背包的方程为dp[i]=max(dp[i-c[j]])+w[j],dp[i])

i:表示当前的背包容量

j:是苹果的序号

dp[i]:是容量为i的背包能放的最大价值

c[j]:序号为j的苹果的大小

w[j]:序号为j的苹果的价值

这个方程翻译成白话文就是   容量为i的背包的最大价值=(当前背包容量-序号为j的苹果的大小)的最大价值+序号为j的苹果的价值  和 容量为i的背包的当前价值 之间的最大值

说着比较绕口。慢慢理解

说白了  ,其实就是取与不取的问题 ,如果取了  那么取后的价值要大于我没有取之前的价值 否则我就不要你  (因为同样大小的背包我要装价值更大的啊)

对着这道题举个例子吧

5     10

1      9

4      4

2      6

5      5

10    8

你能根据自己的想法填下表吗  看结果是否和我的一样

这个结果其实就是根据0-1背包的思想得到的 ,如果你能填 证明你已经入门了

我首先附上0-1背包的代码

[cpp]  view plain copy print ?
  1. for(int i=0;i<n;i++)
  2. {
  3. for(int j=v;j>=0;j--)
  4. {
  5. if(j>=c[i])
  6. dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
  7. }
  8. }

你肯定有几个问题?

1.为什么外层循环是苹果的数目 而不是背包的容量

答:因为每个苹果只能选择一次  如果背包容量在外

2.外循环是对苹果的遍历 那么内循环为什么是v-》0而不是 从0-》v

这个问题我也迷惑了好久   我们仔细看看动态方程dp[i]=max(dp[i-c[j]])+w[j],dp[i])    我们首先假设  有一个苹果大小为1   价值为9

那么dp[1]=max(dp[1-1]+9,dp[1])=9  是正常的 dp[2]=max(dp[2-1]+9,dp[2])=18..dp[3]=27,dp[4]=36等等  发现问题了吧

所以内循环从0-》v是错误的    如果从v-》0就行了  因为在每个苹果循环的时候 我们要保证当前已经遍历的背包对我未遍历的背包没有影响

看完了这些 分析上面的截图吧

首先是对苹果大小为1  价值为9     背包容量为10.....1  最大价值都为9  背包容量为0  最大价值为0

苹果大小为4 价值为4      背包容量为10.....5的价值变为13  为什么呢  还是动态规划方程dp[i]=max(dp[i-c[j]])+w[j],dp[i])    分析一个为5的吧  dp[5]=max(d[4]+4,dp[5])=9+4=13    而在背包容量为4的时候 我们发现价值还是9  没有变化因为这两个苹果大小4+1=5>4

由于我们对每个苹果遍历后 都是当前苹果个数的最优结果   所以当我们遍历完最后一个苹果 那么结果也就是最优化的

就分析这么多吧

这道题的传送门 和AC代码

[cpp]  view plain copy print ?
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. int n,v,max,c[1005],w[1005],dp[1005];
  6. while(scanf("%d %d",&n,&v)!=EOF)
  7. {
  8. if(n==0&&v==0)
  9. break;
  10. memset(dp,0,sizeof(dp));
  11. for(int i=0;i<n;i++)
  12. scanf("%d %d",&c[i],&w[i]);
  13. max=0;
  14. for(int i=0;i<n;i++)
  15. for(int j=v;j>=c[i];j--)
  16. {
  17. //  dp[j]=dp[j];
  18. if(dp[j]<dp[j-c[i]]+w[i])
  19. dp[j]=dp[j-c[i]]+w[i];
  20. if(max<dp[j])
  21. max=dp[j];
  22. }
  23. printf("%d\n",max);
  24. }
  25. return 0;
  26. }

动态规划之01背包问题讲解相关推荐

  1. 题目1025:最大报销额(动态规划之01背包问题)

    题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5270 解决:1272 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具 ...

  2. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  3. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

  4. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  5. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  6. o-1背包问题迭代_经典动态规划:01背包问题的变体

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...

  7. 【动态规划】01背包问题(通俗易懂,超基础讲解)

    问题描述 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capa ...

  8. 动态规划专题 01背包问题详解【转】

    对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...

  9. 动态规划DP——01背包问题

    01 背包问题   今天在算法课上讲解了动态规划算法,其中讲到了01背包问题.这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现.动态规划求解具有以下的性质: 1.最优子结构 ...

最新文章

  1. STL queue priority_queue
  2. 程序员在地铁写代码遭疯狂吐槽!网友:装什么装
  3. SQL操作的组成部分-数据查询
  4. EJS学习(三)之语法规则中
  5. markdown如何设置图片大小_Gitee(码云)实现免费 Markdown 图床
  6. 73 forward动作
  7. DIY协同办公平台(C/S)系列4之通讯录篇
  8. 《大数据》2015年第3期“研究”——社交网络影响力传播研究(上)
  9. N54L文件服务器,N54L安装群晖需要修改的硬件设置
  10. Foobar2000目前最强解码方案
  11. 今日科技联播:全球区块链专利申请数超5000件,Coinplug第一阿里紧随其后
  12. QQ拼音输入法使用评价
  13. 软件设计与体系结构第二版董威_董威-软件设计与体系结构(第2版)-PPT课件.zip-3-4-形式化方法.ppt...
  14. 掌握.NET中的日常打印
  15. 台积电:3纳米芯片工厂地址首选台湾 美国次之
  16. JS去除字符串中间多余空格
  17. java long 运算_Java Long类型,阶乘计算
  18. 宁波大学 软件技术exp_2_1 (1)
  19. Summary of Statistics for Interview
  20. 王者荣耀服务器什么时候增加人数,2019年王者荣耀与和平精英用户数量、启动次数及使用时长分析[图]...

热门文章

  1. 机器学习——决策树与随机森林
  2. Java Excel导出动态自定义单元格样式
  3. 在线视频转音频怎么弄?这几个软件建议你们收藏
  4. Android+CS6:工业动画之变速变方向旋转齿轮
  5. WebGL 实践篇(三)—— 二维图形的平移、旋转、缩放
  6. 大腿根部发黑怎么样白,变白方法
  7. 华为CE交换机堆叠配置
  8. 浅谈基于PLC和Modbus的配电室现场环境监控系统设计及产品选型
  9. numpy多维数组获取指定矩形区域
  10. css 延时几秒代码,CSS3 会聚展开文字动画实例及animation-delay属性规则