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

算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

這篇具有很好參考價值的文章主要介紹了算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

??"Su7"??
作者:Lvzi
文章主要內(nèi)容:算法系列–動態(tài)規(guī)劃–背包問題(3)–完全背包介紹
動態(tài)規(guī)劃完全背包問題,算法,動態(tài)規(guī)劃

大家好,今天為大家?guī)淼氖?code>算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹

一.完全背包問題

鏈接:
完全背包

動態(tài)規(guī)劃完全背包問題,算法,動態(tài)規(guī)劃
可以發(fā)現(xiàn)完全背包問題和01背包問題還是特比相似的

分析:

完全背包問題01背包問題的推廣,是以01背包問題為基礎(chǔ),兩種問題的狀態(tài)表示是相同的

  • dp[i][j]:在[1,i]所有物品中,在不超過體積j的前提下,可以實(shí)現(xiàn)的最大價值

分析狀態(tài)轉(zhuǎn)移方程時也是以最后一個位置的狀態(tài)去劃分,分為選/不選nums[i],此處就體現(xiàn)出完全背包問題和01背包問題最大的差別,01背包問題如果選擇nums[i],選擇的物品的數(shù)量只能是1(+w[i]),但是完全背包問題如果選擇nums[i],可以選擇的數(shù)量是任意多個(+n * w[i]),此時的狀態(tài)是任意多個,這樣的狀態(tài)我們在正則表達(dá)式匹配那道問題中已經(jīng)遇到過,解決思路就是利用數(shù)學(xué)規(guī)律,將任意多個狀態(tài)使用簡單的幾個狀態(tài)表示,具體操作是觀察所有狀態(tài)中不變的量,大膽假設(shè),小心求證!!!

以下是狀態(tài)轉(zhuǎn)移方程的推導(dǎo):
動態(tài)規(guī)劃完全背包問題,算法,動態(tài)規(guī)劃

動態(tài)規(guī)劃完全背包問題,算法,動態(tài)規(guī)劃

  • dp[i][j] = Max(dp[i-1][j],dp[i][j - nums[i]] + w[i])

初始化

  • 根據(jù)狀態(tài)表示分析出不需要初始化

返回值:

  • dp[n][V]

代碼:

import java.util.Scanner;

// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 1.解決第一問
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 獲取物品數(shù)目和體積

        int[] v = new int[n + 1], w = new int[n + 1];
        for(int i = 1; i <= n; i++) {
            v[i] = in.nextInt();// 物品體積
            w[i] = in.nextInt();// 物品價值
        }

        int[][] dp = new int[n + 1][V + 1];
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i-1][j];
                if(j - v[i] >= 0)
                    dp[i][j] = Math.max(dp[i][j],dp[i][j - v[i]] + w[i]);
            }
        }

        System.out.println(dp[n][V]);

        // 1.解決第二問
        dp = new int[n + 1][ V + 1];// 好的代碼風(fēng)格?
        for(int j = 1; j <= V; j++) dp[0][j] = -1;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - v[i] >= 0 && dp[i][j - v[i]] != -1)
                    dp[i][j] = Math.max(dp[i][j],dp[i][j - v[i]] + w[i]);
            }
        }
        System.out.println(dp[n][V] == -1 ? 0 : dp[n][V]);
    }
}

空間優(yōu)化:
同樣的在完全背包問題中也可以進(jìn)行空間優(yōu)化(想想01背包問題中的空間優(yōu)化,通過明確遍歷順序,只是用一個簡單的線性數(shù)組就可以完成填表)

01背包問題的空間優(yōu)化最需要注意的就是遍歷順序的改變,在01背包問題中,為了在填表的時候需要使用的數(shù)據(jù)不被覆蓋掉,需要從右往左遍歷,但是在完全背包問題中,需要從左往右遍歷
動態(tài)規(guī)劃完全背包問題,算法,動態(tài)規(guī)劃

空間優(yōu)化后的代碼:

import java.util.Scanner;

// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 1.解決第一問
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 獲取物品數(shù)目和體積

        int[] v = new int[n + 1], w = new int[n + 1];
        for(int i = 1; i <= n; i++) {
            v[i] = in.nextInt();// 物品體積
            w[i] = in.nextInt();// 物品價值
        }

        int[] dp = new int[V + 1];
        for(int i = 1; i <= n; i++)
            for(int j = v[i]; j <= V; j++)
                dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);

        System.out.println(dp[V]);

        // 2.解決第二問
        dp = new int[ V + 1];// 好的代碼風(fēng)格?
        for(int j = 1; j <= V; j++) dp[j] = -1;
        for(int i = 1; i <= n; i++)
            for(int j = v[i]; j <= V; j++)
                if(dp[j - v[i]] != -1)
                    dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);
            
        System.out.println(dp[V] == -1 ? 0 : dp[V]);
    }
}

以上就是算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹全部內(nèi)容,下一篇文章將會帶來完全背包問題的拓展題目,敬請期待,我是LvZi文章來源地址http://www.zghlxwxcb.cn/news/detail-858013.html

到了這里,關(guān)于算法系列--動態(tài)規(guī)劃--背包問題(3)--完全背包介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 算法篇——動態(tài)規(guī)劃 完全和多重背包問題 (js版)

    算法篇——動態(tài)規(guī)劃 完全和多重背包問題 (js版)

    01 背包 問題和 完全背包 問題的不同點(diǎn)在于,所有的物品只能 使用一次 ,判斷? 哪些物品? 裝進(jìn)背包里 物品價值和 最大;而 完全背包 問題中,所有物品都能 使用n次 ,判斷 哪個物品 裝 n 個進(jìn)去 物品價值和 最大。 01 背包的遞推公式是: 【當(dāng)然先遍歷物品還是背包的容量

    2024年02月08日
    瀏覽(29)
  • 力扣算法刷題Day44|動態(tài)規(guī)劃:完全背包問題 零錢兌換II 組合總和Ⅳ

    力扣題目:#518.零錢兌換II(完全背包組合問題) 刷題時長:7min 解題方法:動態(tài)規(guī)劃(完全背包) 復(fù)雜度分析 時間復(fù)雜度: O(mn),其中 m 是amount,n 是 coins 的長度 空間復(fù)雜度: O(m) 問題總結(jié) 對遞推公式的理解 本題收獲 題意轉(zhuǎn)換:純完全背包是湊成背包最大價值是多少,而本

    2024年02月13日
    瀏覽(27)
  • 動態(tài)規(guī)劃-背包問題-完全背包

    對比01背包,完全背包中的每件物品有無數(shù)件。 也就是說,每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i種物品,體積為j時的最大價值 對于第i件物品: 不拿:dp[i][j]?dp[i-1][j] 拿一件:dp[i][j]?dp[i-1][j-w[i]]+v[i] 拿兩件:dp[i][j]?dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]?dp[i

    2024年04月08日
    瀏覽(20)
  • 動態(tài)規(guī)劃之背包問題——完全背包

    算法相關(guān)數(shù)據(jù)結(jié)構(gòu)總結(jié): 序號 數(shù)據(jù)結(jié)構(gòu) 文章 1 動態(tài)規(guī)劃 動態(tài)規(guī)劃之背包問題——01背包 動態(tài)規(guī)劃之背包問題——完全背包 動態(tài)規(guī)劃之打家劫舍系列問題 動態(tài)規(guī)劃之股票買賣系列問題 動態(tài)規(guī)劃之子序列問題 算法(Java)——動態(tài)規(guī)劃 2 數(shù)組 算法分析之?dāng)?shù)組問題 3 鏈表 算法

    2024年02月03日
    瀏覽(25)
  • 完全背包&多重背包問題(動態(tài)規(guī)劃)

    完全背包問題: 每個物品使用次數(shù)沒有限制,與0-1背包的不同之處在于 遍歷背包的順序 是正序。 多重背包問題: 與完全背包的區(qū)別在于,每一種物品是有個數(shù)限制的,不能無限選擇。這篇博客講解的非常詳細(xì),可以參考學(xué)習(xí): 多重背包問題---超詳細(xì)講解+優(yōu)化(不懂你揍我

    2024年04月10日
    瀏覽(24)
  • 算法競賽必考算法——動態(tài)規(guī)劃(01背包和完全背包)

    算法競賽必考算法——動態(tài)規(guī)劃(01背包和完全背包)

    1.1題目介紹 1.2思路一介紹(二維數(shù)組) 代碼如下: 1.3思路二介紹(一維數(shù)組) 空間優(yōu)化 ??為什么可以使用一維數(shù)組? ??我們先來看一看01背包問題的狀態(tài)轉(zhuǎn)移方程,我們可以發(fā)現(xiàn) f[i]只用到了f[i-1],其他的是沒有用到的,我們可以用滾動數(shù)組來做。 ??還有一個原因就是我

    2024年02月02日
    瀏覽(20)
  • 【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    【動態(tài)規(guī)劃之完全背包問題】完全背包問題的通用解法與優(yōu)化

    ?? 前面的話 ?? 本篇文章將介紹動態(tài)規(guī)劃中的背包問題——完全背包問題,前面我們已經(jīng)介紹了0-1背包問題,其實(shí)完全背包問題就只改了0-1背包問題的一個條件,即物品可選擇次數(shù)由一次改為無數(shù)次,僅此而已,下面我們就來開始介紹完全背包問題。 ??博客主頁:未見

    2023年04月22日
    瀏覽(114)
  • 動態(tài)規(guī)劃:完全背包問題

    動態(tài)規(guī)劃:完全背包問題

    ACwing #3. 完全背包問題 完全背包問題和01背包問題很相似。 01背包問題每個物品只能選一個,而完全背包問題每個物品可以選無限次。 DP問題的關(guān)鍵是找到狀態(tài)轉(zhuǎn)移方程: ①定義f[i][j]表示從前 i 個物品中選擇,體積為 j 的時候的最大價值。 ②那么轉(zhuǎn)移方程f[i][j] = max(f[i - 1][j

    2023年04月19日
    瀏覽(25)
  • 動態(tài)規(guī)劃——完全背包問題

    動態(tài)規(guī)劃——完全背包問題

    由于本人實(shí)力尚淺,接觸算法沒多久,寫這篇blog僅僅是想要提升自己對算法的理解,如果各位讀者發(fā)現(xiàn)什么錯誤,懇請指正,希望和大家一起進(jìn)步。(●’?’●) 了解完全背包問題前可以先去看看01背包問題(良心正解),先了解這個基礎(chǔ)問題會更有利于你了解下面的完全背

    2024年02月04日
    瀏覽(29)
  • 動態(tài)規(guī)劃完全背包問題-java

    動態(tài)規(guī)劃完全背包問題-java

    完全背包問題跟01背包問題思路大致一樣,只不過對于物品的拿取次數(shù)不在限制,我們只需要考慮這點(diǎn)即可。 文章目錄 前言 一、什么是完全背包問題? 二、問題模擬 1.樣例數(shù)據(jù) 2.算法思路 三、代碼如下 1.代碼如下(示例): 2.讀入數(shù) 3.代碼運(yùn)行結(jié)果 總結(jié) 完全背包問題跟

    2024年04月26日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包