背包问题-动态规划java实现的分析与代码

 更新时间:2020年12月20日 09:14:53   作者:猿探索  
这篇文章主要给大家介绍了关于背包问题动态规划java实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、动态规划的原理

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法–动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。

动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。举例:线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;背包问题:01背包问题,完全背包问题,多重背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;

二、分析与代码实现

1、分析

题目:在某个深夜里,一个小偷背着一个总共只能装16v体积的背包进入一家商店偷东西。假如店里有手机一部,价格为2000元,体积为1v;薯片一包,价格为5元,体积为5v;翡翠一块,价格为100000元,体积为10v;一套四大名著,价格30元,体积为6v;电脑一台,价格为6000元,体积为10v。怎么样能够让背包装的下,并且又能使拿到的东西总价格最多?

这种情况下,一共5件东西。小偷偷东西的事件只有两种:拿,不拿。
当他拿的时候,背包体积变小,物件数量减1;当他不拿的时候,背包体积不变,物件数量减1(因为小偷选择不拿这件东西的时候不会返回继续拿,所以他失去了这件东西选择的机会)。

物件数量为i,背包容纳量为v。

1.不拿 b(i-1,v)

2.拿 b(i-1,v-该物品的体积)

两者取最大值

核心代码:

b[i][j]=Math.max(b[i-1][j],b[i-1][j-v]+p);

2、代码分析

public class _背包问题 {

 //物品体积
 private static int[] volume={1,5,10,6,10};
 //物品价格
 private static int[] price={2000,5,100000,30,6000};
 //背包容量
 private static int maxVolumen=16;
 //物品数量
 private static int count=5;

 public static int solution(int maxVolumen,int count,int[] volume,int[] price){
  int[][] b=new int[count+1][maxVolumen+1];
  for (int i=1;i<=count;i++){
   //拿到物品的价格
   int p=price[i-1]; 
   //拿到物品的体积
   int v=volume[i-1]; 
   for (int j=1;j<=maxVolumen;j++){
    //如果物品的体积大于背包容量时,选择不拿。
    if (j<v){
     b[i][j]=b[i-1][j];
     continue;
    }
    b[i][j]=Math.max(b[i-1][j],b[i-1][j-v]+p);
   }
  }
  return b[count][maxVolumen];
 }

 public static void main(String[] args) {
  System.out.println(solution(16,5,volume,price));
 }
}

总结

到此这篇关于背包问题-动态规划java实现的文章就介绍到这了,更多相关背包问题 动态规划java实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA+MySQL实现分库分表的项目实践

    JAVA+MySQL实现分库分表的项目实践

    本文主要介绍了JAVA+MySQL实现分库分表的项目实践,包括水平分表、垂直分表和水平分库等策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

    Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

    这篇文章主要介绍了Spring注解驱动之BeanDefinitionRegistryPostProcessor原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Spring BOOT AOP基础应用教程

    Spring BOOT AOP基础应用教程

    这篇文章主要介绍了Spring BOOT AOP的使用,文章从相关问题展开全文内容详情,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Java中如何获取文件的上级目录

    Java中如何获取文件的上级目录

    这篇文章主要介绍了Java中如何获取文件的上级目录问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 使用maven实现版本覆盖的案例分享

    使用maven实现版本覆盖的案例分享

    这篇文章主要介绍了使用maven实现版本覆盖的案例分享,文中通过图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-10-10
  • PC 端微信扫码注册和登录实例

    PC 端微信扫码注册和登录实例

    这篇文章主要介绍了PC 端微信扫码注册和登录实例的相关资料,需要的朋友可以参考下
    2016-09-09
  • swing分割窗口控件JSplitPane使用方法详解

    swing分割窗口控件JSplitPane使用方法详解

    这篇文章主要为大家详细介绍了swing分割窗口控件JSplitPane的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • ssh框架实现文件上传下载实例代码

    ssh框架实现文件上传下载实例代码

    本篇文章主要介绍了ssh框架文件上传下载实例代码,实例分析了Spring+struts+Hibernate的使用技巧,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • 浅谈JAVA中输入输出流实例详解

    浅谈JAVA中输入输出流实例详解

    Java中的流分为两种,一种是字节流,另一种是字符流。这篇文章主要介绍了JAVA中输入输出流的相关资料,需要的朋友可以参考下
    2016-07-07
  • 详解使用Spring3 实现用户登录以及权限认证

    详解使用Spring3 实现用户登录以及权限认证

    这篇文章主要介绍了详解使用Spring3 实现用户登录以及权限认证,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03

最新评论