一、动态规划
代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法
本质:递推,核心是找到状态转移的方式,写出dp方程。
解决问题:交叉,重叠子问题(最优子问题)
形式:
记忆型递归
递推
与深搜的区别:深搜要所有符合条件的解,动态规划要求最优解(唯一解)
二、题目
有n个重量和价值分别为wi和vi的物品,从这些物品中挑选出重量不超过w的物品,求所有挑选方案中价值总和的最大值。
1<=n<=100
1<=wi,vi<=100
1<=w<<10000
输入:
n=4
(w,v)={(2,3),(1,2),(3,4),(2,3)}
w=5
输出
7(选择第0,1,3号物品)


分析思路

  • 方法一:递推

因为对每个物品只有选和不选两种情况,所以这个问题称为01背包问题。
两个决定性量,重量,价值,
物品只有两种选择拿或者不拿,在重量限定的条件下,使得价值达到最大
与深搜的区别,深搜要所有符合条件的解,动态规划要求最优解
用深搜进行分析,找一个卡点,找到之后只能从卡点开始往后选

  • 代码:

public class Bag01 {static int[] w= {2,1,3,2}; //重量表static int[] v= {3,2,4,2};  //价值表static int n=4; //物品数量static int W=5; //背包的承重极限static int max(int a,int b) {return a;}public static void main(String[] args) {int ww=W;int ans=dfs(0,ww);  //从第一个物品开始System.out.println(ans);}static int dfs(int i,int ww) {//出口条件if(ww<=0) return 0;  //装不进去if(i==n) return 0;  //没东西可选了int v2=dfs(i+1,ww);  //不选择当前物品if(ww>=w[i]) {int v1=v[i]+dfs(i+1,ww-w[i]);  //选择当前物品return max(v1,v2);}else {return v2;}}
}

  • 方法二:记忆型递归(处理重叠子问题)
    二叉树:递归自下往上推

    括号前缀代表层数和从第几个物品开始选,开始选的编号越小所选的范围越大
    记忆:把f(3,2)这样重叠的问题记忆下来
    f(x,y)采用二维数组
    x:长度n,物品数量[0,n-1]
    y:总重量 开辟到w+1
    二维数组第n行第m列
    把二维数组都填为-1

记忆递归:
1.计算前查询
2.计算后保存

  • 代码

import java.util.Arrays;public class Bag01jiyi {static int[] w= {2,1,3,2}; //重量表static int[] v= {3,2,4,2};  //价值表static int n=4; //物品数量static int W=5; //背包的承重极限static int max(int a,int b) {return a;}public static void main(String[] args) {int ww=W;int ans=m(0,ww);  //从第一个物品开始System.out.println(ans);rec=new int[n][W+1];  //二维数组存放for(int i=0;i<n;i++) {Arrays.fill(rec[i], -1);  //重量最小为0}ww=W;ans=m(0,ww);System.out.println(ans);}static int[][] rec;static int m(int i,int ww) {//出口条件if(ww<=0) return 0;if(i==n) return 0;//就算之前先查询if(rec[i][ww]>=0)return rec[i][ww];int v2=m(i+1,ww);  //不选择当前物品int ans;if(ww>=w[i]) {int v1=v[i]+m(i+1,ww-w[i]);  //选择当前物品ans=max(v1,v2);}else {ans=v2;}//计算之后做保存rec[i][ww]=ans;return ans;}
}

动态规划---01背包问题(2种方法)相关推荐

  1. 动态规划—01背包问题

    原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...

  2. 动态规划——0-1背包问题

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...

  3. 动态规划01背包问题入门学习,详细笔记,推荐阅读

    问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...

  4. 动态规划--01背包问题详解

    代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...

  5. Leetcode动态规划——01背包问题

    内容参考 https://blog.csdn.net/yoer77/article/details/70943462 https://labuladong.github.io/ebook/动态规划系列 ...

  6. 动态规划 01 背包问题

    01 背包问题 01 背包问题是很典型的 动态规划问题   问题描述 :  现在有N件商品, 他们的重量和价值分别为 Wi 和Vi  但是你的包最大承受重量是E 现在要那你求出  方案中价值最大是多少 ...

  7. 动态规划 —— 01背包问题

    01背包问题 有n个重量和价值分别为wi,vi的物品. 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 针对每个物品是否放入背包进行搜索 #include <ios ...

  8. 动态规划——01背包问题 看此一篇文章就够了

    本文讲述经典算法--动态规划的 常见问题 01背包  一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...

  9. python实现动态规划0-1背包问题

    一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...

最新文章

  1. 中国移动2016年低端路由器交换机集采结果出炉锐捷网络大份额中标
  2. 我司编写Angular单元测试的一些非正式规范
  3. 使用Javap分析Java代码里的static final的工作原理
  4. android 应用在启动后进行全局的的初始化操作
  5. 报名倒计时 | TeaTalk 深圳站邀您共话安全云世界
  6. 宇宙总统(洛谷-P1781)
  7. 基于TCP和多线程实现无线鼠标键盘-Socket(1)
  8. LeetCode2.两数相加
  9. mysql5.7.1 zip版本安装记录
  10. 如何用一般方式获取C币可用分
  11. 计算机硬件和维护的论文,浅谈计算机的硬件维护论文
  12. 2019数据安装勾选_Origin2019下载和安装教程
  13. 深度剖析供应链风险管理
  14. 如何求矩阵的特征值和特征向量
  15. 计算机进制之间的转换(2进制、10进制、8进制、16进制)
  16. Java--Mac系统终端编译运行java文件
  17. 苗条的生成树_苗条手册
  18. 分类计数原理与分步计数原理_分类or分步?计数原理别再傻傻分不清~
  19. 颜色表大全 | HTML Color Table
  20. HelloWorld之jetty运行

热门文章

  1. python学习视频-2018年最新Python学习路线图(内含大纲+视频+工具)
  2. python画50个图-Matplotlib如何绘制多个子图
  3. python培训班靠谱吗-学python去哪个培训机构好?靠谱的python培训机构推荐
  4. 自学python需要安装什么-学习python需要什么基础吗?老男孩Python
  5. python能做什么工作-学完python能从事什么工作?
  6. 化学人学python有前途吗-用Python解析化学公式
  7. 语音识别的前世今生 | 深度学习彻底改变对话式人工智能
  8. 这4点教你找到小程序专业开发公司
  9. linux 看日期,Linux查看日期和时间
  10. 【java笔记】Stream流(1)你知道什么叫Stream流吗?