背包问题-动态规划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)
上一篇 2022年7月26日 上午9:00
下一篇 2022年7月26日 上午9:00


相关推荐

  • CC攻击如何防御

    CC攻击如何防御CC 攻击是 DDOS 的一种 前身名为 Fatboy 攻击 也是一种常见的网站攻击方法 CC 攻击原理就是模拟多个用户对一些资源消耗较大的页面不断发出请求 从而达到消耗服务器资源的目的 当服务器一直都有处理不完的大量数据请求时 服务器资源浪费过多 就会造成堵塞 而正常用户的访问也会被终止 网站陷入瘫痪状态 不同于 DDOS 攻击 CC 攻击不需要大流量也可达到攻击效果 在有些情况下 CC 攻击也可能没有明显流量特征变化 由于 CC 攻击的来源 IP 都是真实 分散的 且全是有效请求 无法拒绝 对于 CC 攻击的防御 没有像 DDOS 攻击

    2026年3月16日
    3
  • plc编程入门梯形图符号_梯形图编程语言有

    plc编程入门梯形图符号_梯形图编程语言有2019独角兽企业重金招聘Python工程师标准>>>…

    2025年10月6日
    4
  • PMP项目管理学习心得分享

    PMP项目管理学习心得分享一 设定目标 列出每天详细计划首先 抱着必过的决心 并为自己设定目标 给自己列出每阶段的详细计划 再细分到每天的详细计划 比如每天要听几章节的视频 每天要看几页的书 列出计划有助于明确自己每天的任务 督促自己每天学习 找到自己的学习方法 劳逸结合 心态端正 每天自我激励 二 进入学习状态从报完名后 就让自己进入学习状态 建议大家前面时间抓紧 按计划学习 越到最后越不会紧张和不安 所以前面学习不要松懈 一鼓作气 不要想时间还早 学习拖拖拉拉 不然越到最后越紧张 前

    2026年3月26日
    2
  • [基础控件]—状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用…[通俗易懂]

    [基础控件]—状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用…[通俗易懂]一、事件监听对于普通的Button,对其进行事件监听Google官方给出了常见的三种监听方式:1、对每一个button设置事件监听器button.setOnClickListener(View.OnclickListenerlistener);此种方法当button按钮较多时代码显得多、乱、不够简洁明了。2、在Activity中实现接口View.OnclickListener,然后重写…

    2022年7月18日
    16
  • 扩展文件系统resize2fs、lvm

    扩展文件系统resize2fs、lvm1 umount home2 fdisk 命令扩展磁盘分区 3 resize2fs 命令扩展文件系统 4 mount home1 创建 PVpvcreate dev sdc nbsp 2 查看 PVpvspvscanp nbsp 3 创建 VGvgcreate s4Mtestvg nbsp dev sdc nbsp 4 查看 VG

    2026年3月26日
    2
  • 如何处理ThinkPHP数据库的分页查询_paginate返回结构与参数定制

    如何处理ThinkPHP数据库的分页查询_paginate返回结构与参数定制

    2026年3月14日
    2

发表回复

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

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