动态规划---01背包问题(2种方法)
一、动态规划
代表一类问题(最优子结构或子问题最优性)的一般解法,是设计方法或者策略,不是具体算法
本质:递推,核心是找到状态转移的方式,写出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种方法)相关推荐
- 动态规划—01背包问题
原文作者:弗兰克的猫 原文地址:[动态规划]01背包问题 摘要: 01背包问题:n个物品放入容量为c的背包中. 常见解法: 分治法:递归计算,且存在重复计算的bug 自上而下填表法:从大到小使用递归计 ...
- 动态规划——0-1背包问题
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...
- 动态规划01背包问题入门学习,详细笔记,推荐阅读
问题描述: 给定N种物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大?? 在选择物品的时候,对每种物品i只有两种选择, ...
- 动态规划--01背包问题详解
代码随想录day42和day43 动态规划 模块01背包问题 "即使到不了远方,心中也要有远方的模样." 文章目录 1. 01背包理论基础 1.1什么是背包问题 1.2二维dp数组 ...
- Leetcode动态规划——01背包问题
内容参考 https://blog.csdn.net/yoer77/article/details/70943462 https://labuladong.github.io/ebook/动态规划系列 ...
- 动态规划 01 背包问题
01 背包问题 01 背包问题是很典型的 动态规划问题 问题描述 : 现在有N件商品, 他们的重量和价值分别为 Wi 和Vi 但是你的包最大承受重量是E 现在要那你求出 方案中价值最大是多少 ...
- 动态规划 —— 01背包问题
01背包问题 有n个重量和价值分别为wi,vi的物品. 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 针对每个物品是否放入背包进行搜索 #include <ios ...
- 动态规划——01背包问题 看此一篇文章就够了
本文讲述经典算法--动态规划的 常见问题 01背包 一篇文章带你学会01背包问题,妈妈再也不担心我遇到01背包了!!! 问题描述 有n个物品,它们有各自的体积和价值,现有给定容量m的背包,如何让背包 ...
- python实现动态规划0-1背包问题
一.动态规划算法介绍 动态规划算法通常用于求解具有某种最优性质的问题.在这类问题中,可能会有许多可行解.每一个解都对应于一个值,我们希望找到具有最优值的解.动态规划算法与分治法类似,其基本思想也是将待 ...
最新文章
- 中国移动2016年低端路由器交换机集采结果出炉锐捷网络大份额中标
- 我司编写Angular单元测试的一些非正式规范
- 使用Javap分析Java代码里的static final的工作原理
- android 应用在启动后进行全局的的初始化操作
- 报名倒计时 | TeaTalk 深圳站邀您共话安全云世界
- 宇宙总统(洛谷-P1781)
- 基于TCP和多线程实现无线鼠标键盘-Socket(1)
- LeetCode2.两数相加
- mysql5.7.1 zip版本安装记录
- 如何用一般方式获取C币可用分
- 计算机硬件和维护的论文,浅谈计算机的硬件维护论文
- 2019数据安装勾选_Origin2019下载和安装教程
- 深度剖析供应链风险管理
- 如何求矩阵的特征值和特征向量
- 计算机进制之间的转换(2进制、10进制、8进制、16进制)
- Java--Mac系统终端编译运行java文件
- 苗条的生成树_苗条手册
- 分类计数原理与分步计数原理_分类or分步?计数原理别再傻傻分不清~
- 颜色表大全 | HTML Color Table
- HelloWorld之jetty运行
热门文章
- python学习视频-2018年最新Python学习路线图(内含大纲+视频+工具)
- python画50个图-Matplotlib如何绘制多个子图
- python培训班靠谱吗-学python去哪个培训机构好?靠谱的python培训机构推荐
- 自学python需要安装什么-学习python需要什么基础吗?老男孩Python
- python能做什么工作-学完python能从事什么工作?
- 化学人学python有前途吗-用Python解析化学公式
- 语音识别的前世今生 | 深度学习彻底改变对话式人工智能
- 这4点教你找到小程序专业开发公司
- linux 看日期,Linux查看日期和时间
- 【java笔记】Stream流(1)你知道什么叫Stream流吗?