【Java实现】动态规划算法解决01背包问题

这篇具有很好参考价值的文章主要介绍了【Java实现】动态规划算法解决01背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、问题描述:

一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大?

2、动态规划算法的概述

1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法

2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )

4)动态规划可以通过填表的方式来逐步推进,得到最优解

3、解题思路

利用动态规划来解决,每次遍历到的第i个物品,根据 w[i]和v[i]来确定是否需要将该物品放入背包中。

对于给定的n个物品,

v[i]:第i个物品的价值

w[i]:第i个物品的重量

c:为背包的容量

v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。

1)v[i][0]=v[0][j]=0,表示第一行和第一列是0。

2)当w[i]>j时:v[i][j]=v[i-1][j] ,当准备加入新增的物品的容量大于当前背包的容量时,就直接使用上一个单元格的装入

3)当j>=w[i]时:v[i][j]=max{v[i-1][j] ,v[i]+v[i-1][j-w[i]]},当准备加入的新增的物品的容量小于等于当前背包的容量。

其中:

v[i-1][j]:就是上一个单元格的装入的最大值

v[i]:表示当前物品的价值

v[i-1][j-w[i]]:装入i-1物品,到剩余空间j-w[i]的最大值

【Java实现】动态规划算法解决01背包问题

4、完整代码及运行结果

package com.example.demo;

public class DynamicProgramming {
    public static void main(String[] args) {
        //物品的重量
        int[] c = {7, 2, 6, 3, 5};
        //物品的价值
        int[] w = {21, 18, 9, 15, 6};
        //物品的个数
        int n = w.length;
        //背包的容量
        int v = 14;

        knapsackDP(c, w, n, v);

    }


    /**
     *利用动态规划来解决:
     * 每次遍历到的第i个物品,根据 w[i]和v[i]来确定是否需要将该物品放入背包中。
     * 对于给定的n个物品,
     * v[i]:第i个物品的价值
     * w[j]:第i个物品的重量
     * c:为背包的容量
     * v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值。
     *
     * @param w   物品的重量
     * @param val 物品的价值
     * @param n   物品的个数
     * @param m   背包的容量
     * @return
     */
    public static int knapsackDP(int[] w, int[] val, int n, int m) {
        //v[i][j] 表示在前i个物品中能够装入容量为j的背包中的最大价值
        int[][] v = new int[n + 1][m + 1];
        //记录放入物品的情况
        int[][] records = new int[n + 1][m + 1];

        //初始化第一行和第一列为0
        for (int i = 0; i < v.length; i++) {
            v[i][0] = 0;
        }
        for (int i = 0; i < v[0].length; i++) {
            v[0][i] = 0;
        }

        for (int i = 1; i < v.length; i++) {
            for (int j = 1; j < v[0].length; j++) {
                //当w[i]>j时,数组下标从1开始,所以-1
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {//当j>=w[i]时,数组下标从1开始,所以-1
                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        //记录
                        records[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }

                }
            }
        }

        //
        for (int i = 0; i < v.length; i++) {
            for (int j = 0; j < v[i].length; j++) {
                System.out.print(v[i][j] + " ");
            }
            System.out.println();
        }

        System.out.println("============================");
        //行的最大下标
        int i = records.length - 1;
        //列的最大下标
        int j = records[0].length - 1;
        while (i > 0 && j > 0) { //从records的最后开始找
            if (records[i][j] == 1) {
                System.out.printf("第%d个物品放入到背包\n", i);
                j -= w[i - 1]; //w[i-1]
            }
            i--;
        }
        return 0;
    }
}

程序运行结果:文章来源地址https://www.toymoban.com/news/detail-406851.html

【Java实现】动态规划算法解决01背包问题

到了这里,关于【Java实现】动态规划算法解决01背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法套路十四——动态规划之背包问题:01背包、完全背包及各种变形

    如果对递归、记忆化搜索及动态规划的概念与关系不太理解,可以前往阅读算法套路十三——动态规划DP入门 背包DP介绍:https://oi-wiki.org/dp/knapsack/ 0-1背包:有n个物品,第i个物品的体积为w[i],价值为v[i],每个物品至多选一个, 求体积和不超过capacity时的最大价值和,其中i从

    2024年02月10日
    浏览(60)
  • C++算法初级11——01背包问题(动态规划2)

    辰辰采药 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时

    2024年02月02日
    浏览(50)
  • 动态规划——使用python解决01背包问题

    目录 什么是01背包问题? 题目: 输入格式: 输出格式: 代码实现: 代码执行示例: 代码解析:         01背包问题是一个经典的组合优化问题,通常用于描述如下情境:假设有一个背包,它能够承受一定的重量上限(即背包容量),同时有一组物品,每件物品有自己的重

    2024年02月03日
    浏览(58)
  • 【算法日志】动态规划刷题:01背包问题,多重背包问题(day37,day38)

    目录 前言 目标和(01背包) 一和零(01背包) 零钱兑换(多重背包) 排列总和(多重背包) 这两天都是背包问题,其中的01背包的一些应用问题需要一定的数学建模能力,需要i将实际问题简化成我们熟悉的背包问题;而这两天的多重背包问题还算比较基础,但也要我明白了

    2024年02月11日
    浏览(56)
  • 【算法|动态规划 | 01背包问题No.2】AcWing 423. 采药

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成

    2024年02月06日
    浏览(50)
  • 动态规划——01背包问题(C++实现)

    整体思路: 利用动态规划,其目的就是将原问题分解成几个子问题,通过求解简单的子问题,把原问题给解决,就比如斐波那契数列方程: f[i]=f[i-1]+f[i-2]; 动态规划的核心就是找到原问题与子问题的关系,并列出动态转移方程。 实现方法: 这里我们可以定义一个二维数组,

    2024年02月11日
    浏览(55)
  • 动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2023年04月16日
    浏览(50)
  • 01背包问题三种解决(贪心动态规划分支限界)

    一、实验目的 1、深入理解背包相关问题。 2、能正确设计相应的算法,解决实际问题。   3、掌握算法时间复杂度分析。 二、实验要求 用3种方法求解0-1背包问题(贪心算法、 动态规划、分支限界法 ),获得精确最优解或近似最优解均可。 通过一个规模较大的实例比较不同

    2024年02月02日
    浏览(57)
  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

    动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大

    2024年02月01日
    浏览(129)
  • 算法设计与分析实验二:动态规划法求解TSP问题和01背包问题

    【实验内容】 (1)tsp问题:利用动态规划算法编程求解TSP问题,并进行时间复杂性分析。 输入:n个城市,权值,任选一个城市出发; 输出:以表格形式输出结果,并给出向量解和最短路径长度。 (2)01背包问题:利用动态规划算法编程求解0-1背包问题,并进行时间复杂性分

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包