国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java實(shí)現(xiàn)】動(dòng)態(tài)規(guī)劃算法解決01背包問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了【Java實(shí)現(xiàn)】動(dòng)態(tài)規(guī)劃算法解決01背包問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、問(wèn)題描述:

一個(gè)旅行者有一個(gè)最多能裝m公斤的背包,現(xiàn)在有n中物品,每件的重量分別是W1、W2、……、Wn,每件物品的價(jià)值分別為C1、C2、……、Cn, 需要將物品放入背包中,要怎么樣放才能保證背包中物品的總價(jià)值最大?

2、動(dòng)態(tài)規(guī)劃算法的概述

1)動(dòng)態(tài)規(guī)劃(Dynamic Programming)算法的核心思想是:將大問(wèn)題劃分為小問(wèn)題進(jìn)行解決,從而一步步獲取最優(yōu)解的處理算法

2)動(dòng)態(tài)規(guī)劃算法與分治算法類(lèi)似,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題,然后從這些子問(wèn)題的解得到原問(wèn)題的解。

3)與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃求解的問(wèn)題,經(jīng)分解得到子問(wèn)題往往不是互相獨(dú)立的。 ( 即下一個(gè)子階段的求解是建立在上一個(gè)子階段的解的基礎(chǔ)上,進(jìn)行進(jìn)一步的求解 )

4)動(dòng)態(tài)規(guī)劃可以通過(guò)填表的方式來(lái)逐步推進(jìn),得到最優(yōu)解

3、解題思路

利用動(dòng)態(tài)規(guī)劃來(lái)解決,每次遍歷到的第i個(gè)物品,根據(jù) w[i]和v[i]來(lái)確定是否需要將該物品放入背包中。

對(duì)于給定的n個(gè)物品,

v[i]:第i個(gè)物品的價(jià)值

w[i]:第i個(gè)物品的重量

c:為背包的容量

v[i][j]表示在前i個(gè)物品中能夠裝入容量為j的背包中的最大價(jià)值。

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

2)當(dāng)w[i]>j時(shí):v[i][j]=v[i-1][j] ,當(dāng)準(zhǔn)備加入新增的物品的容量大于當(dāng)前背包的容量時(shí),就直接使用上一個(gè)單元格的裝入

3)當(dāng)j>=w[i]時(shí):v[i][j]=max{v[i-1][j] ,v[i]+v[i-1][j-w[i]]},當(dāng)準(zhǔn)備加入的新增的物品的容量小于等于當(dāng)前背包的容量。

其中:

v[i-1][j]:就是上一個(gè)單元格的裝入的最大值

v[i]:表示當(dāng)前物品的價(jià)值

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

【Java實(shí)現(xiàn)】動(dòng)態(tài)規(guī)劃算法解決01背包問(wèn)題

4、完整代碼及運(yùn)行結(jié)果

package com.example.demo;

public class DynamicProgramming {
    public static void main(String[] args) {
        //物品的重量
        int[] c = {7, 2, 6, 3, 5};
        //物品的價(jià)值
        int[] w = {21, 18, 9, 15, 6};
        //物品的個(gè)數(shù)
        int n = w.length;
        //背包的容量
        int v = 14;

        knapsackDP(c, w, n, v);

    }


    /**
     *利用動(dòng)態(tài)規(guī)劃來(lái)解決:
     * 每次遍歷到的第i個(gè)物品,根據(jù) w[i]和v[i]來(lái)確定是否需要將該物品放入背包中。
     * 對(duì)于給定的n個(gè)物品,
     * v[i]:第i個(gè)物品的價(jià)值
     * w[j]:第i個(gè)物品的重量
     * c:為背包的容量
     * v[i][j]表示在前i個(gè)物品中能夠裝入容量為j的背包中的最大價(jià)值。
     *
     * @param w   物品的重量
     * @param val 物品的價(jià)值
     * @param n   物品的個(gè)數(shù)
     * @param m   背包的容量
     * @return
     */
    public static int knapsackDP(int[] w, int[] val, int n, int m) {
        //v[i][j] 表示在前i個(gè)物品中能夠裝入容量為j的背包中的最大價(jià)值
        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++) {
                //當(dāng)w[i]>j時(shí),數(shù)組下標(biāo)從1開(kāi)始,所以-1
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {//當(dāng)j>=w[i]時(shí),數(shù)組下標(biāo)從1開(kāi)始,所以-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("============================");
        //行的最大下標(biāo)
        int i = records.length - 1;
        //列的最大下標(biāo)
        int j = records[0].length - 1;
        while (i > 0 && j > 0) { //從records的最后開(kāi)始找
            if (records[i][j] == 1) {
                System.out.printf("第%d個(gè)物品放入到背包\n", i);
                j -= w[i - 1]; //w[i-1]
            }
            i--;
        }
        return 0;
    }
}

程序運(yùn)行結(jié)果:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-406851.html

【Java實(shí)現(xiàn)】動(dòng)態(tài)規(guī)劃算法解決01背包問(wèn)題

到了這里,關(guān)于【Java實(shí)現(xiàn)】動(dòng)態(tài)規(guī)劃算法解決01背包問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法套路十四——?jiǎng)討B(tài)規(guī)劃之背包問(wèn)題:01背包、完全背包及各種變形

    算法套路十四——?jiǎng)討B(tài)規(guī)劃之背包問(wèn)題:01背包、完全背包及各種變形

    如果對(duì)遞歸、記憶化搜索及動(dòng)態(tài)規(guī)劃的概念與關(guān)系不太理解,可以前往閱讀算法套路十三——?jiǎng)討B(tài)規(guī)劃DP入門(mén) 背包DP介紹:https://oi-wiki.org/dp/knapsack/ 0-1背包:有n個(gè)物品,第i個(gè)物品的體積為w[i],價(jià)值為v[i],每個(gè)物品至多選一個(gè), 求體積和不超過(guò)capacity時(shí)的最大價(jià)值和,其中i從

    2024年02月10日
    瀏覽(89)
  • C++算法初級(jí)11——01背包問(wèn)題(動(dòng)態(tài)規(guī)劃2)

    C++算法初級(jí)11——01背包問(wèn)題(動(dòng)態(tài)規(guī)劃2)

    辰辰采藥 辰辰是個(gè)天資聰穎的孩子,他的夢(mèng)想是成為世界上最偉大的醫(yī)師。為此,他想拜附近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個(gè)難題。醫(yī)師把他帶到一個(gè)到處都是草藥的山洞里對(duì)他說(shuō):“孩子,這個(gè)山洞里有一些不同的草藥,采每一株都需要一些時(shí)

    2024年02月02日
    瀏覽(92)
  • 動(dòng)態(tài)規(guī)劃——使用python解決01背包問(wèn)題

    動(dòng)態(tài)規(guī)劃——使用python解決01背包問(wèn)題

    目錄 什么是01背包問(wèn)題? 題目: 輸入格式: 輸出格式: 代碼實(shí)現(xiàn): 代碼執(zhí)行示例: 代碼解析: ? ? ? ? 01背包問(wèn)題是一個(gè)經(jīng)典的組合優(yōu)化問(wèn)題,通常用于描述如下情境:假設(shè)有一個(gè)背包,它能夠承受一定的重量上限(即背包容量),同時(shí)有一組物品,每件物品有自己的重

    2024年02月03日
    瀏覽(26)
  • 【算法日志】動(dòng)態(tài)規(guī)劃刷題:01背包問(wèn)題,多重背包問(wèn)題(day37,day38)

    【算法日志】動(dòng)態(tài)規(guī)劃刷題:01背包問(wèn)題,多重背包問(wèn)題(day37,day38)

    目錄 前言 目標(biāo)和(01背包) 一和零(01背包) 零錢(qián)兌換(多重背包) 排列總和(多重背包) 這兩天都是背包問(wèn)題,其中的01背包的一些應(yīng)用問(wèn)題需要一定的數(shù)學(xué)建模能力,需要i將實(shí)際問(wèn)題簡(jiǎn)化成我們熟悉的背包問(wèn)題;而這兩天的多重背包問(wèn)題還算比較基礎(chǔ),但也要我明白了

    2024年02月11日
    瀏覽(95)
  • 【算法|動(dòng)態(tài)規(guī)劃 | 01背包問(wèn)題No.2】AcWing 423. 采藥

    【算法|動(dòng)態(tài)規(guī)劃 | 01背包問(wèn)題No.2】AcWing 423. 采藥

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專(zhuān)欄【手撕算法系列專(zhuān)欄】【AcWing算法提高學(xué)習(xí)專(zhuān)欄】 ??本專(zhuān)欄旨在提高自己算法能力的同時(shí),記錄一下自己的學(xué)習(xí)過(guò)程,希望對(duì)大家有所幫助 ??希望我們一起努力、成

    2024年02月06日
    瀏覽(93)
  • 動(dòng)態(tài)規(guī)劃——01背包問(wèn)題(C++實(shí)現(xiàn))

    動(dòng)態(tài)規(guī)劃——01背包問(wèn)題(C++實(shí)現(xiàn))

    整體思路: 利用動(dòng)態(tài)規(guī)劃,其目的就是將原問(wèn)題分解成幾個(gè)子問(wèn)題,通過(guò)求解簡(jiǎn)單的子問(wèn)題,把原問(wèn)題給解決,就比如斐波那契數(shù)列方程: f[i]=f[i-1]+f[i-2]; 動(dòng)態(tài)規(guī)劃的核心就是找到原問(wèn)題與子問(wèn)題的關(guān)系,并列出動(dòng)態(tài)轉(zhuǎn)移方程。 實(shí)現(xiàn)方法: 這里我們可以定義一個(gè)二維數(shù)組,

    2024年02月11日
    瀏覽(22)
  • 動(dòng)態(tài)規(guī)劃算法解決背包問(wèn)題,算法分析與C語(yǔ)言代碼實(shí)現(xiàn),時(shí)間效率解析

    動(dòng)態(tài)規(guī)劃算法解決背包問(wèn)題,算法分析與C語(yǔ)言代碼實(shí)現(xiàn),時(shí)間效率解析

    ??【數(shù)據(jù)結(jié)構(gòu)與算法】專(zhuān)題正在持續(xù)更新中,各種數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建原理與運(yùn)用?,經(jīng)典算法的解析?都在這兒,歡迎大家前往訂閱本專(zhuān)題,獲取更多詳細(xì)信息哦?????? ??本系列專(zhuān)欄 - ?數(shù)據(jù)結(jié)構(gòu)與算法_勾欄聽(tīng)曲_0 ??歡迎大家 ??? ?點(diǎn)贊?? ?評(píng)論?? ?收藏?? ??個(gè)人主

    2023年04月16日
    瀏覽(18)
  • 01背包問(wèn)題三種解決(貪心動(dòng)態(tài)規(guī)劃分支限界)

    01背包問(wèn)題三種解決(貪心動(dòng)態(tài)規(guī)劃分支限界)

    一、實(shí)驗(yàn)?zāi)康?1、深入理解背包相關(guān)問(wèn)題。 2、能正確設(shè)計(jì)相應(yīng)的算法,解決實(shí)際問(wèn)題。 ? 3、掌握算法時(shí)間復(fù)雜度分析。 二、實(shí)驗(yàn)要求 用3種方法求解0-1背包問(wèn)題(貪心算法、 動(dòng)態(tài)規(guī)劃、分支限界法 ),獲得精確最優(yōu)解或近似最優(yōu)解均可。 通過(guò)一個(gè)規(guī)模較大的實(shí)例比較不同

    2024年02月02日
    瀏覽(18)
  • java實(shí)現(xiàn)0-1背包問(wèn)題方案(動(dòng)態(tài)規(guī)劃-貪心算法-回溯-分支定界)

    動(dòng)態(tài)規(guī)劃算法時(shí)間復(fù)雜度較低,能夠求解較大規(guī)模的問(wèn)題,但空間復(fù)雜度較高,不適用于數(shù)據(jù)量較大的問(wèn)題。 貪心算法時(shí)間復(fù)雜度較低,能夠求解較大規(guī)模的問(wèn)題,但不能保證求得的解是最優(yōu)解。 回溯算法能夠求解較小規(guī)模的問(wèn)題,但時(shí)間復(fù)雜度較高,不適用于數(shù)據(jù)量較大

    2024年02月01日
    瀏覽(25)
  • 算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問(wèn)題和01背包問(wèn)題

    算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問(wèn)題和01背包問(wèn)題

    【實(shí)驗(yàn)內(nèi)容】 (1)tsp問(wèn)題:利用動(dòng)態(tài)規(guī)劃算法編程求解TSP問(wèn)題,并進(jìn)行時(shí)間復(fù)雜性分析。 輸入:n個(gè)城市,權(quán)值,任選一個(gè)城市出發(fā); 輸出:以表格形式輸出結(jié)果,并給出向量解和最短路徑長(zhǎng)度。 (2)01背包問(wèn)題:利用動(dòng)態(tài)規(guī)劃算法編程求解0-1背包問(wèn)題,并進(jìn)行時(shí)間復(fù)雜性分

    2024年02月03日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包