题目描述

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背包问题的更多相关文章

  1. 算法-动态规划DP小记

    算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...

  2. [Dynamic Programming]动态规划之背包问题

    动态规划之背包问题 例题 现有4样物品n = ['a', 'b', 'c', 'd'],重量分别为w = [2, 4, 5, 3],价值分别为v = [5, 4, 6, 2].背包最大承重c = 9. ...

  3. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...

  4. 动态规划(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+ ...

  5. 记录结果再利用的"动态规划"之背包问题

    参考<挑战程序设计竞赛>p51 https://www.cnblogs.com/Ymir-TaoMee/p/9419377.html 01背包问题 问题描述:有n个重量和价值分别为wi.v ...

  6. 【动态规划/多重背包问题】POJ1014-Dividing

    多重背包问题的优化版来做,详见之前的动态规划读书笔记. dp[i][j]表示前i中数加得到j时第i种数最多剩余几个(不能加和得到i的情况下为-1)递推式为: dp[i][j]=mi(dp[i-1][j ...

  7. 【Luogu】【关卡2-15】动态规划的背包问题(2017年10月)【还差一道题】

    任务说明:这是最基础的动态规划.不过如果是第一次接触会有些难以理解.加油闯过这个坎. 01背包二维数组优化成滚动数组的时候有坑有坑有坑!!!必须要downto,downto,downto 情景和代码见 ...

  8. 深入理解动态规划DP

    通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意.下面来看看几个常见的动态规划思路的经典问题 例一.有一段楼梯有10 ...

  9. poj 1742 Coins (动态规划,背包问题)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 32977   Accepted: 11208 Descripti ...

随机推荐

  1. python代码`if not x:` 和`if x is not None:`和`if not x is None:`

    转自 http://blog.csdn.net/sasoritattoo/article/details/12451359 代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if ...

  2. HTML基础1

    网页的基本结构(双标签):html,title 页面标题,head 网页上控制信息,body 页面内容,所有属性都写在前面. body的属性:bgcolor 背景色:text 文字颜色:margin ...

  3. python程序之profile分析

    操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 1.Python开发的程序在使用过程中很慢,想确定下是哪段代码比较慢: 2.Python开发的程序在使用过程 ...

  4. linux bash 和 sh的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt189 Linux 中的 shell 有很多类型,其中最常用的几种是: Bou ...

  5. js文件引用方式及其同步执行与异步执行

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp74   任何以appendChild(scriptNode) 的方式引入 ...

  6. IS-IS完整笔记

    IS-IS笔记大全 1.公开,ISO国际标准化组织(按照中文顺序翻译) 中间系统到中间系统 双栈.集成 数据传递机制 Cons面向连接网络服务(TCP) Clns缺少链接网络服务(UDP) Is-is ...

  7. Vue项目搭建基础之Vue-cli模版测试

    第一步安装node,nodejs.org下载node稳定版安装包.node -v   (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...

  8. 团队作业4——第一次项目冲刺(Alpha版本)1st day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 主界面以及游戏界面大体上完成了 界面内的功能正在写 2.登陆方面 QQ授权还未申请 申请完在登陆界面完成后实现用QQ ...

  9. 201521123028《Java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看. 对上周PTA的实验5-3中的矩形和圆形类做注释. Q2.面向对象 ...

  10. 201521123064 《Java程序设计》第1周学习总结

    1. 本章学习总结 1.了解Java与C/C++的区别,Java语言所写程序较为繁琐,C/C++较为简洁. 2.学会使用cmd进行程序的编译及运行. 3.学会利用JDK辅助Java编程. 4.使用ec ...