问题:

* 对一组物品:
* 重量为:w1,w2,w3....wn
* 价值为:v1,v2,v3,....vn
* 和一个可以存放重量为W的背包
* 求这些物品装进去如何才会是最右价值的装法

解题思路

对于这些物品进行分类,判断第i个物品是否需要加入背包

获取到的结果就是,放入前i个物品进入重量是j的方式是
V[i,j] = max {V[i - 1, j], vi + V[i - 1, j - wi]} (包含和不包含第i个的问题)
当wi超标的时候,V[i,j] = V[i - 1, j] 也就是 wi > j

问题求解:

解题:

package cn.xf.algorithm.ch08DynamicProgramming;import org.junit.Test;/*** 动态规划,背包问题* * 对一组物品:* 重量为:w1,w2,w3....wn* 价值为:v1,v2,v3,....vn* 和一个可以存放重量为W的背包* 求这些物品装进去如何才会是最右价值的装法* .* * @版权:福富软件 版权所有 (c) 2017* @author xiaof* @version Revision 1.0.0* @see:* @创建日期:2017年8月7日* @功能说明:**/
public class BackPack {
//    解题思路:对于这些物品进行分类,判断第i个物品是否需要加入背包
//    获取到的结果就是,放入前i个物品进入重量是j的方式是
//    V[i,j] = max {V[i - 1, j], vi +  V[i - 1, j - wi]} (包含和不包含第i个的问题)
//    当wi超标的时候,V[i,j] = V[i - 1, j] 也就是 wi > j/*** * @param values  依次物品的价值* @param weight  依次物品的重量* @param W 背包大小*/public int[][] typeBack(int values[], int weight[], int W) {int resultValue[][] = new int[values.length][W + 1];//初始化,当价值为0的时候,那么背包里面肯定没有物品for(int i = 0; i < W + 1; ++i) {resultValue[0][i] = 0;}//遍历所有的物品,并且遍历背包重量for(int i = 1; i < values.length; ++i) {//遍历所有物品,当背包大小为0的时候,那么价值结果肯定为0resultValue[i][0] = 0;for(int j = 1; j <= W; ++j) {//背包大小慢慢增加//当前物品i是否对应不同的背包是否放入的问题,价值是几何if(j > W || j - weight[i] < 0) {//当前物品重量大于背包,背包不可能包含这个物品resultValue[i][j] = resultValue[i - 1][j];} else {resultValue[i][j] = maxValue(resultValue[i - 1][j], values[i] + resultValue[i - 1][j - weight[i]]);}}}return resultValue;}public int maxValue(int a, int b) {if(a > b) {return a;} else {return b;}}//对背包问题实现动态规划的记忆功能,避免对部门数据的重复计算public int MFKTypeBack(int result[][], int values[], int weight[], int i, int j) {//递归就是,判断需要求的位置的值是否已经存在,如果还没求出来,那么就递归int value;if(i == 0 || j == 0) {//递归终止条件value =  result[i][j];} else {if(result[i][j] <= 0) {//如果这个值还没有被获取出来//判断当前物品的重量是否超标if(j - weight[i] < 0) { //这个表示,如果背包中包含这个物品,去掉这个物品之后,背包中物品最少要不小于0//当前物品重量大于背包,背包不可能包含这个物品value = MFKTypeBack(result, values, weight, i - 1, j);} else {value = maxValue(MFKTypeBack(result, values, weight, i - 1, j), values[i] + MFKTypeBack(result, values, weight, i - 1, j - weight[i]));}result[i][j] = value;}}return result[i][j];}@Testpublic void test1() {int weight[] = {0,2, 1, 3, 2};int values[]= {0, 12, 10, 20, 15 }; // 价值数组int W = 5;BackPack bp = new BackPack();int result[][] = bp.typeBack(values, weight, W);for (int i = 0; i < result.length; i++) {for (int j = 0; j < result[0].length; j++) {System.out.print(result[i][j] + "     ");}System.out.println();}int result2[][] = new int[weight.length][W + 1];for(int i = 0; i < weight.length; ++i) {for(int j = 0; j < W + 1; ++j) {result2[i][j] = 0;}}//从第一个物品选中开始int valueR = bp.MFKTypeBack(result2, values, weight, 4, 5);System.out.println("结果值:" + valueR);}}

  

结果:

转载于:https://www.cnblogs.com/cutter-point/p/7299865.html

【算法设计与分析基础】21、动态规划-背包问题相关推荐

  1. 第一章 算法设计与分析基础知识

    系列文章目录 第一章 算法设计与分析基础知识 第二章 算法的分治策略 第三章 算法的动态规划 第四章 算法的贪心法 -- @[TOC](这里写目录标题) # 一级目录 ## 二级目录 ### 三级目录 ...

  2. 算法设计与分析基础-笔记-上

    算法设计与分析基础 绪论 什么是算法 一系列解决问题的明确指令,对于符合一定规范的输入,能够在有限的时间内获得要求的输出. 例子:最大公约数:俩个不全为0 的非负整数 m m m和 n n n的最大公 ...

  3. 计算机算法设计与分析读后感,算法设计与分析基础经典读后感有感

    <算法设计与分析基础>是一本由Anany levitin著作,清华大学出版社出版的胶版纸图书,本书定价:49.00元,页数:409,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助 ...

  4. 算法设计与分析基础知识

    一.算法设计基础 算法是(algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列. 算法的五个特性: 输入:一个算法可以有零个或多个输入. 输出:一个算法有一个输出或多个输出. 有穷性( ...

  5. 算法设计与分析入门篇----动态规划 1

    正在网易云课堂学习王宏志老师的算法设计与分析入门篇课程视频,将学习中的作业问题发上来与大家一同讨论.这篇是对第四周的作业第一题个人的一些思路,希望与大家一同学习. 题目内容: 给定有 n 个整数组成的 ...

  6. 算法设计与分析基础知识点

    前言:全文参考徐承志老师的PPT 适合期末复习,查缺补漏,有缺漏或错误欢迎指正,后面的第九章内容之后会继续补充. 目录 一.算法基础概念 二.算法分析基础 1.概念 2.算法设计的一般过程 3.时间复 ...

  7. 算法设计与分析 实验四 动态规划求解流水线问题

    动态规划求解流水线问题 一.实验目的与要求 1. 实验目的: 2. 实验亮点: 二.实验内容与方法 1. 实验内容: 2. 实验要求: 三.实验步骤与过程 (一)暴力穷举法 1.算法描述: 2.时间复 ...

  8. 算法设计与分析基础第三版

    课后题答案 一.算法级基础知识 1.算法的基本概念 解决问题的确定方法和有限步骤称为算法,对于计算机科学来说,算法指的是对特定问题的求解步骤的一种描述,是若干条指令的有穷序列.并有以下特性:输入.输出 ...

  9. 算法设计与分析基础 第一章谜题

    习题1.1 10.b 欧几里得游戏 一开始,板上写有两个不相等的正整数,两个玩家交替写数字,每一次,当前玩家都必须在板上写出任意两个板上数字的差,而且这两个数字必须是新的,也就是说,不能与板上任何一个 ...

最新文章

  1. 腾讯 AI 2019这一年
  2. aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式
  3. zabbix 监控 elasticsearch
  4. 你了解 Java 的 jstat 命令吗?
  5. asp.net如何在用户关闭浏览器时执行Session_End方法
  6. 【机器学习】FaceBook开源全网第一个时序王器--Kats。
  7. AVA:Netflix的剧照个性化甄选平台
  8. 面向对象之迪米特法则
  9. Python缩进的几个原则
  10. VS2008调试总结
  11. 超大规模NLP模型升级,来智源大会见证世界记录的刷新
  12. testmeshpro合批_TextMesh Pro新手使用手册
  13. Redis Nosql数据库
  14. OpenCasCade——将鼠标点的位置转换为基于OCC三维坐标系中在某一面上的坐标
  15. cfree安装与使用
  16. Java JDK 8的安装与配置
  17. Unity 大面积花草风吹动效果以及编辑
  18. 阿里云盘内测_阿里云盘即将推出,欲与百度网盘较高下
  19. 苹果库乐队怎么玩_苹果手机如何自定义铃声?这个方法最简单。
  20. Linux命令:ls -l(ll)结果解析

热门文章

  1. 2021.5.17-5.24 人工智能行业每周技术动态
  2. 【JVM实用参数】(六) 吞吐量收集器
  3. RabbitMQ延时消息队列
  4. Android打印机--蓝牙打印
  5. 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)
  6. php 身份证反面时间转化 2005.11.01-2025.11.01
  7. 修改Mysql57的root密码
  8. 自动气象站和气象信息网络
  9. 华硕fl5600l拆机电池_华硕FL5600l拆机
  10. 我的世界java史莱姆生成条件_我的世界史莱姆生成条件 史莱姆在哪里