记忆搜索与动态规划——DP背包问题
题目描述
01背包问题
有n个重量和价值分别为\(w_i,v_i\)的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值中总和的最大值。
限制条件
- 1 <= n <= 100
- 1 <= \(w_i,v_i\) <= 100
- 1 <= W <= 10000
样例输入
n = 4
(w,v) = {(2,3) (1,2) (3,4) (2,2)}
W = 5
样例输出
7(选择0,1,3号物品)
暴力求解
# include <iostream>
# include <algorithm>
using namespace std;
int n, W;
const int MAX_N = 10000;
int w[MAX_N], v[MAX_N];
int rec(int i, int j)
{
int res;
if (i == n)
{
res = 0;//在递归中,这也就相当于是循环的终止条件了
}
else if (j < w[i])//无法挑选物品
{
res = rec(i + 1, j);//采用递归的方法,对下一个物品进行挑选
}
else//挑选和不挑选都尝试一下
{
res = max(rec(i + 1, j), rec(i + 1, j - w[i]) + v[i]);
//对于挑选的情况,因为采用了递归的方式,j 最为各个物品之间的和,每次当然要减去
//挑选出来的满足条件的上一个物品的重量,并且对于挑选出的满足条件的物品的价值进行相加
}
return res;
}
void solve()
{
printf("%d\n", rec(0, W));//从第0件物品开始挑选
}
int main()
{
cin >> n;
cout << "输入每个物品的重量";
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
cout << "输入每个物品的价值";
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
cout << "输入不能超过的最大的重量";
cin >> W;
solve();
return 0;
}
小结
- 对于这一段代码,rec(i + 1, j - w[i]) + v[i] 尤其是对于这个可以挑选的这一段代码
的解释,想了一一下,一开始是有一个j 作为标准,从第i个物品开始挑选重量 小于j的物品,如果挑选出
来一个这样的物品了,那么再挑选下一个物品的时候就必须要把前一个物品的重量减去,然后以这个新的
“重量”来挑选下一个物品,为什么要这样做呢,原因很简单,因为是要求挑选出的物品总重量必须不能超过
W 的物品的重量。当然了,对于没有挑选出来的,根本也就不存在价值的可能。不用相加。 - 对于递归其实在某种意义上市一种循环,只是循环的条件有所不同。
记忆搜索与动态规划——DP背包问题的更多相关文章
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- [Dynamic Programming]动态规划之背包问题
动态规划之背包问题 例题 现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2].背包最大承重c = 9. ...
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...
- 动态规划(DP),0-1背包问题
题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+ ...
- 记录结果再利用的"动态规划"之背包问题
参考<挑战程序设计竞赛>p51 https://www.cnblogs.com/Ymir-TaoMee/p/9419377.html 01背包问题 问题描述:有n个重量和价值分别为wi.v ...
- 【动态规划/多重背包问题】POJ1014-Dividing
多重背包问题的优化版来做,详见之前的动态规划读书笔记. dp[i][j]表示前i中数加得到j时第i种数最多剩余几个(不能加和得到i的情况下为-1)递推式为: dp[i][j]=mi(dp[i-1][j ...
- 【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)【还差一道题】
任务说明:这是最基础的动态规划.不过如果是第一次接触会有些难以理解.加油闯过这个坎. 01背包二维数组优化成滚动数组的时候有坑有坑有坑!!!必须要downto,downto,downto 情景和代码见 ...
- 深入理解动态规划DP
通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10 ...
- poj 1742 Coins (动态规划,背包问题)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 32977 Accepted: 11208 Descripti ...
随机推荐
- [2012-06-29]sed根据行号范围执行替换
测试数据: personball@vostro:SHELL$cat aaa <instrumentation android:name="aaa" android:name= ...
- 自己为什么注册博客(csdn讲师:Array)
记录生活,记录技术,记录青春. 势若在己,则人力可以至:势若在人,则忧心亦无益. 倘若势不在己,该怎么办? 天下之势,本如流水.若流于他处,则处心积虑,断流开源,独占大势. 这是一个最好的时代,也是一 ...
- 《物联网框架ServerSuperIO教程》- 22.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率
22.1 概述及要解决的问题 设备驱动有DeviceDynamic接口,可以继承并增加新的实时数据属性,每次通讯完成后更新这些属性数据.原来是通过DeviceDynamic接口实体类反射的方式获 ...
- UICollectionView中Cell左对齐 居中 右对齐 等间距------你想要的,这里都有
支持靠左,居中,靠右,等间距对齐. 靠左等间距.png 居中等间距.png 靠右等间距.png #import <UIKit/UIKit.h> typedef NS_ENUM(NSInte ...
- this的用法 – JavaScript深入浅出(二)
写在前面 上一篇中,我们对于JavaScript中原始值.复杂值以及内存空间进行了一个深入浅出的总结,这次我们来聊一聊JavaScript中this关键字的深入浅出的用法. 在 JavaScript ...
- Java学习记录:文件的输入输出流
Java中的输入.输出流中可以用于文件的读写,拷贝. 由于文件都是由字节组成的,可以将文件中的内容以字节的方式读取出来. 输入流还可以直接转换为图片来使用.其实ImageIcon提供了方法可以直接打开 ...
- nginx小问题
配置nginx与ftp图片服务器:安装后,要在/usr/local/nginx/conf/nginx.conf里面的server中(带有localhost的那一块)修改为location \ {roo ...
- NHibernate教程(21)——二级缓存(下)
本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时 ...
- 标题:a++和++a的区别
以前我也是老搞不懂a++和++a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用! 看完这个例子就懂了: 例1:$a = 8, 求 ++a + a++ - --a + a-- + ++a ...
- Http协议详解,获取doPost,doGet提交的数据,以及编码问题
一 什么是Http协议 http协议: 浏览器客户端 和 服务器端 之间数据传输的格式规范 二 如何查看Http协议的内容 1)使用火狐的firebug插件(右键->firebug->网 ...