动态规划之01背包问题讲解
给大家附上一个题目吧,便于理解
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背包的代码
- for(int i=0;i<n;i++)
- {
- for(int j=v;j>=0;j--)
- {
- if(j>=c[i])
- dp[j]=max(dp[j-c[i]]+w[i],dp[j]);
- }
- }
你肯定有几个问题?
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代码
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- int n,v,max,c[1005],w[1005],dp[1005];
- while(scanf("%d %d",&n,&v)!=EOF)
- {
- if(n==0&&v==0)
- break;
- memset(dp,0,sizeof(dp));
- for(int i=0;i<n;i++)
- scanf("%d %d",&c[i],&w[i]);
- max=0;
- for(int i=0;i<n;i++)
- for(int j=v;j>=c[i];j--)
- {
- // dp[j]=dp[j];
- if(dp[j]<dp[j-c[i]]+w[i])
- dp[j]=dp[j-c[i]]+w[i];
- if(max<dp[j])
- max=dp[j];
- }
- printf("%d\n",max);
- }
- return 0;
- }
动态规划之01背包问题讲解相关推荐
- 题目1025:最大报销额(动态规划之01背包问题)
题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5270 解决:1272 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具 ...
- 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析
// 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...
- 经典动态规划:0-1 背包问题
经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...
- 动态规划解决0-1背包问题详解(图文并茂)
动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...
- 背包问题动态规划matlab,01背包问题动态规划详解
计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...
- o-1背包问题迭代_经典动态规划:01背包问题的变体
点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong 公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...
- 【动态规划】01背包问题(通俗易懂,超基础讲解)
问题描述 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? 为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capa ...
- 动态规划专题 01背包问题详解【转】
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...
- 动态规划DP——01背包问题
01 背包问题 今天在算法课上讲解了动态规划算法,其中讲到了01背包问题.这是一种典型的动态规划问题,于是下课之后我使用java进行了相对应的代码实现.动态规划求解具有以下的性质: 1.最优子结构 ...
最新文章
- STL queue priority_queue
- 程序员在地铁写代码遭疯狂吐槽!网友:装什么装
- SQL操作的组成部分-数据查询
- EJS学习(三)之语法规则中
- markdown如何设置图片大小_Gitee(码云)实现免费 Markdown 图床
- 73 forward动作
- DIY协同办公平台(C/S)系列4之通讯录篇
- 《大数据》2015年第3期“研究”——社交网络影响力传播研究(上)
- N54L文件服务器,N54L安装群晖需要修改的硬件设置
- Foobar2000目前最强解码方案
- 今日科技联播:全球区块链专利申请数超5000件,Coinplug第一阿里紧随其后
- QQ拼音输入法使用评价
- 软件设计与体系结构第二版董威_董威-软件设计与体系结构(第2版)-PPT课件.zip-3-4-形式化方法.ppt...
- 掌握.NET中的日常打印
- 台积电:3纳米芯片工厂地址首选台湾 美国次之
- JS去除字符串中间多余空格
- java long 运算_Java Long类型,阶乘计算
- 宁波大学 软件技术exp_2_1 (1)
- Summary of Statistics for Interview
- 王者荣耀服务器什么时候增加人数,2019年王者荣耀与和平精英用户数量、启动次数及使用时长分析[图]...