最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)動態(tài)規(guī)劃背包問題

 更新時間:2021年06月21日 17:03:25   作者:Abro.  
本文主要介紹使用java實現(xiàn)動態(tài)規(guī)劃的背包問題,詳細使用圖文和多種案例進行解析,幫助理解該算法

前言

給定 n n n 種物品和一個背包。物品 i i i 的重量是 w i wi wi,其價值為 v i vi vi,背包的容量為 c c c。問應如何選擇裝入背包的物品,使得裝入背包中物品的總價值最大?

一、原理

0 − 0 - 0− 1 1 1 背包問題是一個特殊的整數(shù)規(guī)劃問題。

在這里插入圖片描述

1.1 最優(yōu)子結(jié)構(gòu)性質(zhì)

在這里插入圖片描述在這里插入圖片描述

1.2 遞歸關系

在這里插入圖片描述

設所給 0 − 1 0-1 0−1 背包問題的子問題的最優(yōu)值為 m(i,j),即 m(i,j)是背包容量為 j,可選擇物品為 i,i+1,…,n 時 0-1背包問題的最優(yōu)值。由 0-1背包問題的最優(yōu)子結(jié)構(gòu)性質(zhì),可以建立計算 m(i,j)的遞歸式如下:

在這里插入圖片描述

在這里插入圖片描述

二、算法描述

2.1 算法描述

在這里插入圖片描述

偽代碼:

在這里插入圖片描述

2.2 圖解

在這里插入圖片描述

在這里插入圖片描述

2.3 構(gòu)造最優(yōu)解

在這里插入圖片描述
在這里插入圖片描述


三、 0 − 1 0-1 0−1 背包問題相關題目

3.1 題目

已知有5個物體,它們的重量分別為:2,2,4,5,4,各物體的價值依次為6,3,5,4,6,背包大小為10,使用動態(tài)規(guī)劃法求矩陣m[i][j],并給出最優(yōu)解。修改數(shù)據(jù)為:5個物體,它們的重量分別為:1,1,2,3,2,各物體的價值依次為6,3,5,4,6,背包大小為6,使用動態(tài)規(guī)劃法求矩陣m[i][j],并給出最優(yōu)解

3.2 源程序(Java求解 0 − 1 0-1 0−1背包問題)

/**
 * 0-1背包問題(動態(tài)規(guī)劃法求解)
 */
public class E3_9 {
    //物品的個數(shù)+1(第一個數(shù)我寫成0)
    static int N = 6;
    //static int C = 7;
    static int C = 11;
    /**
     * 程序的入口
     * @param args
     */
    public static void main(String[] args) {
        //int n = N-1;
        //背包的容量
        int c = C-1;
        int i;
        //物體的重量
        //int w[] = new int[N];
        int w[] = new int[]{0,2,2,4,5,4};
        //int w[] = new int[]{0,1,1,2,3,2};
        //物體的價值
        //int v[] = new int[N];
        int v[] = new int[]{0,6,3,5,4,6};
        //動態(tài)規(guī)劃法求解過程的矩陣
        int m[][] = new int[N][C];
        //選擇的結(jié)果
        int x[] = new int [N];

        // for (i = 1; i < N; i++) {
        //     w[i] = 1+(int) (Math.random()*5);
        //     v[i] = 1+(int) (Math.random()*10);
        // }

        knapsack(v,w,c,m);
        traceback(m,w,c,x);

        System.out.printf("背包能裝的最大價值為:"+"%d  \n ",m[1][c]);
        for (i = 1; i <= c; i++) {
            System.out.printf("%2d  \t",i);
        }
        System.out.printf("重量 價值\n");

        for (i = 1; i < N; i++) {
            System.out.printf("%d:",i);
            for (int j = 1; j <= c; j++) {
                System.out.printf("%2d  \t",m[i][j]);
            }
            System.out.printf("%2d%4d\n",w[i],v[i]);
        }
        System.out.printf("\n\n物品的重量");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",w[i]);
        }
        System.out.printf("\n物品的價值");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",v[i]);
        }
        System.out.printf("\n選擇的結(jié)果");
        for (i = 1; i < N; i++) {
            System.out.printf("%2d   \t",x[i]);
        }
        System.out.printf("\n");
    }

    /**
     * 由0-1背包問題的最優(yōu)子結(jié)構(gòu)性質(zhì)建立的遞歸式
     * @param v 存儲物品價值的數(shù)組
     * @param w 存儲物品重量的數(shù)組
     * @param c 背包容量
     * @param m 動態(tài)規(guī)劃法求解過程的矩陣
     */
    public static void knapsack(int []v,int []w,int c,int [][]m){
        int n=v.length-1;
        int jMax=Math.min(w[n]-1,c);
        for(int j=0;j<=jMax;j++)  m[n][j]=0;
        for(int j=w[n];j<=c;j++)  m[n][j]=v[n];
        for(int i=n-1;i>0;i--){
            jMax=Math.min(w[i]-1,c);
            for(int j=0;j<=jMax;j++)
                m[i][j]=m[i+1][j];
            for(int j=w[i];j<=c;j++)
                m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
        }
        //m[1][c]=m[2][c];
        //對于i=1時的兩種情況
        if(c>=w[1])
            m[1][c]=Math.max(m[2][c],m[2][c-w[1]]+v[1]);
        else
            m[1][c]=m[2][c];
    }

    /**
     * 構(gòu)造最優(yōu)解
     * @param m 動態(tài)規(guī)劃法求解過程的矩陣
     * @param w 存儲物體的重量的數(shù)組
     * @param c 背包容量
     * @param x 存儲選擇結(jié)果的數(shù)組
     */
    public static void traceback(int [][]m,int []w,int c,int []x){
        int n=w.length-1;
        for(int i=1;i<n;i++)
            if(m[i][c]==m[i+1][c])
                x[i]=0;
            else {
                x[i]=1;
                c-=w[i];
            }
        x[n]=(m[n][c]>0)?1:0;
    }
}

3.3 運行結(jié)果

在這里插入圖片描述

在這里插入圖片描述


總結(jié)

動態(tài)規(guī)劃基本步驟

  • 找出最優(yōu)解的性質(zhì),并刻劃其結(jié)構(gòu)特征。
  • 遞歸地定義最優(yōu)值。
  • 以自底向上的方式計算出最優(yōu)值。
  • 根據(jù)計算最優(yōu)值時得到的信息,構(gòu)造最優(yōu)解。

到此這篇關于Java實現(xiàn)動態(tài)規(guī)劃背包問題的文章就介紹到這了,更多相關java動態(tài)規(guī)劃內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java創(chuàng)建可執(zhí)行的Jar文件的方法實踐

    Java創(chuàng)建可執(zhí)行的Jar文件的方法實踐

    創(chuàng)建的可執(zhí)行Jar文件實際就是在原始Jar的清單文件中添加了Main-Class的配置,本文主要介紹了Java創(chuàng)建可執(zhí)行的Jar文件的方法實踐,感興趣的可以了解一下
    2023-12-12
  • java開發(fā)RocketMQ之NameServer路由管理源碼分析

    java開發(fā)RocketMQ之NameServer路由管理源碼分析

    這篇文章主要為大家介紹了java開發(fā)中RocketMQ之NameServer路由管理源碼分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • java實現(xiàn)五子棋程序

    java實現(xiàn)五子棋程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)五子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    Spring?Boot?中的?@DateTimeFormat?和?@JsonFormat?的用法及作用詳解

    本文介紹了SpringBoot中的@DateTimeFormat和@JsonFormat注解的用法,解釋了它們在處理日期和時間數(shù)據(jù)時的作用,并通過實例代碼展示了如何在REST控制器中使用這些注解,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 一文帶你掌握Java ImageIO類

    一文帶你掌握Java ImageIO類

    Java中的ImageIO類是Java標準庫中用于處理圖像的一個非常常用的 API,它提供了讀取和寫入多種常見圖像格式的功能,如JPEG、PNG、BMP、GIF等,本文將全面詳細地介紹Java中的ImageIO類的使用方法,需要的朋友可以參考下
    2023-05-05
  • Springboot整合junit過程解析

    Springboot整合junit過程解析

    這篇文章主要介紹了Springboot整合junit過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Java?代碼本地設置Hadoop用戶名密碼的方法

    Java?代碼本地設置Hadoop用戶名密碼的方法

    在Hadoop環(huán)境中,通常使用Kerberos進行身份驗證,這篇文章主要介紹了Java?代碼本地設置Hadoop用戶名密碼的方法,需要的朋友可以參考下
    2024-08-08
  • Java中的Spring?如何處理循環(huán)依賴

    Java中的Spring?如何處理循環(huán)依賴

    這篇文章主要介紹了Java中的Spring?如何處理循環(huán)依賴,依賴指的是Bean與Bean之間的依賴關系,循環(huán)依賴指的是兩個或者多個Bean相互依賴,關于更多Spring?處理循環(huán)依賴的詳情,需要的朋友可以參考下面文章具體內(nèi)容
    2022-05-05
  • SpringBoot連接Redis2種模式解析

    SpringBoot連接Redis2種模式解析

    這篇文章主要介紹了SpringBoot連接Redis2種模式解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • 解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因

    解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因

    這篇文章主要介紹了解讀SpringBoot中addCorsMappings配置跨域與攔截器互斥問題的原因,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

象山县| 贡觉县| 东兰县| 施秉县| 三明市| 乐山市| 沽源县| 和田县| 淳化县| 五原县| 泰来县| 治县。| 白河县| 湟源县| 张家川| 文安县| 仁布县| 镇安县| 正阳县| 炎陵县| 涞源县| 佛教| 张家口市| 丹东市| 沛县| 龙游县| 沙田区| 东城区| 彩票| 远安县| 常州市| 马关县| 岳普湖县| 贵德县| 仪陇县| 星座| 尉氏县| 宝山区| 英吉沙县| 高唐县| 德惠市|