背包问题-动态规划java实现代码

背包问题-动态规划java实现代码背包问题-动态规划背包问题是如今面试流行的面试题之一,我们可用动态规划解题

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

背包问题-动态规划


一、动态规划的原理

动态规划(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));
    }
}

本人初次写博客,在b站学子烁老师视频而总结的,如有不好之处,请多多指教。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164413.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]

    android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]一.获得图片路径当我们通过Intent打开相册,获取图片后,在onActivityResult回调中会得到图片的Uri。但是Uri无法直接获得图片的路径。如果你曾经直接操作过android里的数据库的话,应该明白,Uri可以通过ContentResolver获得数据库表里的数据。例如:content://com.android.providers.media.documents/document/…

    2022年9月22日
    0
  • SpringMVC——使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容

    SpringMVC框架中使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容

    2022年2月26日
    39
  • C6000系列DSP的EMIFA接口

    C6000系列DSP的EMIFA接口DSP6455的EMIFA模块之前介绍了DSP6455的GPIO和中断部分。今天,继续介绍EMIFA模块。关于C6000系列的GPIO,请参考:C6000系列DSP的GPIO模块关于C6000系列的中断系统,请参考:C6000系列DSP的中断系统——————————————–华丽分割—–

    2022年6月15日
    25
  • python hexdump_笨办法学 Python · 续 练习 26:`hexdump`

    python hexdump_笨办法学 Python · 续 练习 26:`hexdump`练习26:hexdump你已经用xargs完成了热身,现在正在代码/审计的循环中。你现在将尝试以“测试优先”方式完成下一个挑战。这就是,你编写测试,它描述你的预期行为,然后实现该行为,直到通过测试。你将要复制hexdump工具,并尝试将你的版本的输出与真实版本匹配。这是“测试优先”开发真正有帮助的地方,因为它自动化了模仿另一个软件的流程。当你需要编写一个糟糕的软件的替代品时,这种技术非常有用。软…

    2022年9月21日
    0
  • Redis——Windows安装

    本篇只谈安装,后续会深入讲解Redis,比如它的内存管理,快照,订阅等待。针对不同的用户,Redis有Windows和Linux两种环境安装,官网上下的是Statble版是Linux,大家一定要注意。由于本人做本地端,所以以下谈的是Windows安装。本文Redis下载地址:https://github.com/MSOpenTech/redis/releases,今天介绍,Redis版本用…

    2022年4月6日
    63
  • 如果要学习web前端开发,需要学习什么?

    如果要学习web前端开发,需要学习什么?遇到很多新手,都会问,如果要学习web前端开发,需要学习什么?难不难?多久能入门?怎么能快速建一个网站?工资能拿到多少?还有些让我推荐一些培训机构什么的要去学习。我建议是自学,实在是觉得自己没有这个能

    2022年8月6日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号