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

背包問題(貪心)& 二維01背包問題 Java

這篇具有很好參考價(jià)值的文章主要介紹了背包問題(貪心)& 二維01背包問題 Java。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

背包問題(貪心)

最優(yōu)裝載問題

題目描述

有n件物品和一個(gè)最大承重為w 的背包。第i件物品的重量是weight[i],每件只能用一次,求裝入背包的最多物品數(shù)量。

題目分析

  • 因?yàn)槲覀?strong>只要求裝入物品的數(shù)量,所以裝重的顯然沒有裝輕的劃算
  • 因此將數(shù)組weight[i]按從小到大排序,依次選擇每個(gè)物品,直到裝不下為止,就可以得到裝入背包的最多物品數(shù)量。

代碼

public static int stone(int n, int w, int[] weight) {
	Arrays.sort(weight);    //將weight數(shù)組從小到大排序
    int max = 0;
    int num = 0;
    for(int i = 0; i < n; i++) {
        if(max + weight[i] <= w){
        	max += weight[i];
            num += 1;
       }
    }
    return num;
}

01背包問題

與上面的貪心背包問題而言,貪心背包問題中物品的價(jià)值就是它的重量。
先前題主做的拿金幣問題,也可以說是一道背包問題,不過其中背包的容量是無限的,物品就是金幣。

題目描述

有n件物品和一個(gè)最大承重為bagweight 的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價(jià)值總和最大。
卡碼網(wǎng)第46題

題目分析

顯然也是一道動態(tài)規(guī)劃題,也就是說背包問題是動態(tài)規(guī)劃問題的子集,當(dāng)然這不重要。
我們先觀察一下背包的屬性:

  • 當(dāng)前裝入物品的個(gè)數(shù)
  • 當(dāng)前裝入物品的總重量(容量)
  • 當(dāng)前裝入物品的總價(jià)值
  • 關(guān)鍵在當(dāng)前重量的基礎(chǔ)上使得價(jià)值最高

注:下文基本轉(zhuǎn)述于代碼隨想錄的網(wǎng)站,只加了部分自己的理解

可轉(zhuǎn)到代碼隨想錄的網(wǎng)站去更深刻地理解01背包知識
代碼隨想錄的鏈接:戳這里進(jìn)入

老規(guī)矩動歸五部曲

定義dp數(shù)組

定義一個(gè)二維數(shù)組dp[i][j],將i定義為當(dāng)前放入了多少個(gè)物品,表示

  • 下標(biāo)為[0-i]的物品里任意取,
  • 放進(jìn)容量為j的背包
  • 價(jià)值總和最大是多少。(dp數(shù)組的值)

確定dp數(shù)組遞歸公式

在決定是否放入第i個(gè)物品時(shí),顯然有兩種情況

  • 要么不滿足放入第i個(gè)物品的情況(當(dāng)物品i的重量大于背包j的重量時(shí),物品i無法放進(jìn)背包中)
dp[i][j] = dp[i-1][j];
  • 要么滿足放入第i個(gè)物品的情況,此時(shí)比較放入前后的價(jià)值總和,判斷是否要放入。
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i] + value[i];

dp數(shù)組的初始化

從dp[i][j]出發(fā),

  1. 當(dāng)背包容量j為0的時(shí)候,則放不下任何物品,背包中價(jià)值總和為0;
for (int i = 0 ; i < weight.length; i++) { 
    dp[1][0] = 0;

再看其他情況。

  1. 因?yàn)檫f推公式dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    當(dāng)中含有i-1,即我們在遍歷時(shí)肯定從i=1的時(shí)候開始遍歷,那么物品為0的時(shí)候就一定要初始化。
    此時(shí)考慮是否可以加入物品0,
    • 當(dāng) j < weight[0]的時(shí)候,dp[0][j] 為 0
    • 當(dāng)j >= weight[0]時(shí),dp[0][j] 為value[0]
for (int j = 0 ; j < weight[0]; j++)   // 如果把dp數(shù)組預(yù)先初始化為0了,這一步可以省略
    dp[0][j] = 0;
    
for (int j = weight[0]; j <= bagweight; j++) 
    dp[0][j] = value[0];
  1. 其他位置可以任意初始化,但是一開始就統(tǒng)一把dp數(shù)組統(tǒng)一初始為0,更方便一些。

dp數(shù)組的遍歷順序

顯然有兩個(gè)遍歷的維度:物品與背包容量
先遍歷物品,或先遍歷背包容量呢。
這里兩種遍歷順序都可以,是因?yàn)?,遞推的方向分別是由上得到與由左得到,而兩個(gè)遍歷順序都是會先得到遞推公式需要的舊數(shù)據(jù),因此不影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-798527.html

//先遍歷物品
for(int i = 1; i < weight.size(); i++) { // 遍歷物品
    for(int j = 0; j <= bagweight; j++) { // 遍歷背包容量
        if (j < weight[i]) dp[i][j] = dp[i - 1][j];
        else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

    }
}
//先遍歷背包容量
for(int j = 0; j <= bagweight; j++) { // 遍歷背包容量
    for(int i = 1; i < weight.size(); i++) { // 遍歷物品
        if (j < weight[i]) dp[i][j] = dp[i - 1][j];
        else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
}

舉例說明dp數(shù)組

代碼

import java.util.Arrays;

public class BagProblem {
    public static void main(String[] args) {
        int[] weight = {1,3,4};//這里是代碼隨想錄的示范用例
        int[] value = {15,20,30};
        int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }

    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        // 創(chuàng)建dp數(shù)組
        int goods = weight.length;  // 獲取物品的數(shù)量
        int[][] dp = new int[goods + 1][bagSize + 1];  // 給物品增加冗余維,i = 0 表示沒有物品可選

        // 初始化dp數(shù)組,默認(rèn)全為0即可
        // 填充dp數(shù)組
        for (int i = 1; i <= goods; i++) {
            for (int j = 1; j <= bagSize; j++) {
                if (j < weight[i - 1]) {  // i - 1 對應(yīng)物品 i
                    /**
                     * 當(dāng)前背包的容量都沒有當(dāng)前物品i大的時(shí)候,是不放物品i的
                     * 那么前i-1個(gè)物品能放下的最大價(jià)值就是當(dāng)前情況的最大價(jià)值
                     */
                    dp[i][j] = dp[i - 1][j];
                } else {
                    /**
                     * 當(dāng)前背包的容量可以放下物品i
                     * 那么此時(shí)分兩種情況:
                     *    1、不放物品i
                     *    2、放物品i
                     * 比較這兩種情況下,哪種背包中物品的最大價(jià)值最大
                     */
                    dp[i][j] = Math.max(dp[i - 1][j] , dp[i - 1][j - weight[i - 1]] + value[i - 1]);  // i - 1 對應(yīng)物品 i
                }
            }
        }

        // 打印dp數(shù)組
        for(int[] arr : dp){
            System.out.println(Arrays.toString(arr));
        }
    }
}

到了這里,關(guān)于背包問題(貪心)& 二維01背包問題 Java的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(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)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • 算法訓(xùn)練第四十二天|01背包問題 二維 、01背包問題 一維、416. 分割等和子集

    算法訓(xùn)練第四十二天|01背包問題 二維 、01背包問題 一維、416. 分割等和子集

    視頻鏈接:https://www.bilibili.com/video/BV1cg411g7Y6/ 參考:https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 對于面試的話,其實(shí)掌握01背包,和完全背包,就夠用了,最多可以再來一個(gè)多重背包。 而完全背包又是也是01背包稍作變化而來,即:完全

    2024年02月01日
    瀏覽(26)
  • 【Java實(shí)現(xiàn)】動態(tài)規(guī)劃算法解決01背包問題

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

    1、問題描述: 一個(gè)旅行者有一個(gè)最多能裝m公斤的背包,現(xiàn)在有n中物品,每件的重量分別是W1、W2、……、Wn,每件物品的價(jià)值分別為C1、C2、……、Cn, 需要將物品放入背包中,要怎么樣放才能保證背包中物品的總價(jià)值最大? 2、動態(tài)規(guī)劃算法的概述 1)動態(tài)規(guī)劃(Dynamic Progra

    2023年04月09日
    瀏覽(92)
  • 從二維數(shù)組到一維數(shù)組——探索01背包問題的動態(tài)規(guī)劃優(yōu)化

    從二維數(shù)組到一維數(shù)組——探索01背包問題的動態(tài)規(guī)劃優(yōu)化

    本文將繼續(xù)上一篇博客爬樓梯之后繼續(xù)講解同樣用到了動態(tài)規(guī)劃的 01背包問題 在解決動態(tài)規(guī)劃問題時(shí),我們經(jīng)常面臨著空間復(fù)雜度的挑戰(zhàn)。01背包問題是一個(gè)典型的例子,通常使用二維數(shù)組來表示狀態(tài)轉(zhuǎn)移,但這樣會帶來額外的空間開銷。在本文中,我們將探討如何通過優(yōu)化

    2024年04月11日
    瀏覽(28)
  • 【沖刺藍(lán)橋杯-真題訓(xùn)練】遞增三元組、回文日期、01背包問題、 數(shù)組切分

    【沖刺藍(lán)橋杯-真題訓(xùn)練】遞增三元組、回文日期、01背包問題、 數(shù)組切分

    ?? 博客主頁:??@披星戴月的賈維斯 ?? 歡迎關(guān)注:??點(diǎn)贊??收藏??留言 ??系列專欄:?? 藍(lán)橋杯 ??請不要相信勝利就像山坡上的蒲公英一樣唾手可得,但是請相信,世界上總有一些美好值得我們?nèi)σ愿?,哪怕粉身碎骨?? ??一起加油,去追尋、去成為更好的自己!

    2024年01月17日
    瀏覽(21)
  • 藍(lán)橋杯備賽day02 -- 算法訓(xùn)練題 拿金幣Java

    藍(lán)橋杯備賽day02 -- 算法訓(xùn)練題 拿金幣Java

    目錄 題目: 問題描述 輸入格式 輸出格式 解題過程 第一步 定義dp數(shù)組 第二步 確定 dp 數(shù)組遞推公式 ?第三步 dp數(shù)組的初始化 第四步 dp數(shù)組的遍歷順序 第五步 舉例說明 ?報(bào)錯:內(nèi)存超限 用dp數(shù)組去存儲位置上的金幣 dp數(shù)組從二維降為一維 ?收獲: ? 有一個(gè)N x N的方格,每一個(gè)

    2024年01月17日
    瀏覽(30)
  • 01背包(動態(tài)規(guī)劃,貪心算法,回溯法,分支限界法)

    01背包(動態(tài)規(guī)劃,貪心算法,回溯法,分支限界法)

    有n個(gè)物品,它們有各自的體積和價(jià)值,現(xiàn)有給定容量的背包,如何讓背包里裝入的物品具有最大的價(jià)值總和? number=4,capacity=8 物品編號(i) W(體積) V(價(jià)值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是動態(tài)規(guī)劃 1.動態(tài)規(guī)劃算法是通過拆分問題,定義問題狀態(tài)和狀態(tài)之間的關(guān)系, 使得

    2024年02月08日
    瀏覽(23)
  • 【藍(lán)橋杯備賽Java組】語言基礎(chǔ)|競賽常用庫函數(shù)|輸入輸出|String的使用|常見的數(shù)學(xué)方法|大小寫轉(zhuǎn)換

    【藍(lán)橋杯備賽Java組】語言基礎(chǔ)|競賽常用庫函數(shù)|輸入輸出|String的使用|常見的數(shù)學(xué)方法|大小寫轉(zhuǎn)換

    ???個(gè)人主頁:深魚~ ??收錄專欄:藍(lán)橋杯 ??歡迎 ??點(diǎn)贊?評論?收藏 目錄 一、編程基礎(chǔ) 1.1 Java類的創(chuàng)建 ?1.2 Java方法 ?1.3 輸入輸出 ?1.4 String的使用 二、競賽常用庫函數(shù) 1.常見的數(shù)學(xué)方法 2.大小寫轉(zhuǎn)換 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,

    2024年01月21日
    瀏覽(89)
  • 【藍(lán)橋杯備賽Java組】第一章·語言基礎(chǔ)|競賽常用庫函數(shù)|輸入輸出|String的使用|常見的數(shù)學(xué)方法|大小寫轉(zhuǎn)換

    【藍(lán)橋杯備賽Java組】第一章·語言基礎(chǔ)|競賽常用庫函數(shù)|輸入輸出|String的使用|常見的數(shù)學(xué)方法|大小寫轉(zhuǎn)換

    ???個(gè)人主頁:深魚~ ??收錄專欄:藍(lán)橋杯 ??歡迎 ??點(diǎn)贊?評論?收藏 目錄 一、編程基礎(chǔ) 1.1 Java類的創(chuàng)建 ?1.2 Java方法 ?1.3 輸入輸出 ?1.4 String的使用 二、競賽常用庫函數(shù) 1.常見的數(shù)學(xué)方法 2.大小寫轉(zhuǎn)換 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,

    2024年01月19日
    瀏覽(98)
  • 動態(tài)規(guī)劃(DP)---- 01背包入門詳解----二維圖是學(xué)會的關(guān)鍵

    ? ? 動態(tài)規(guī)劃,Dynamic Programing(簡稱DP),個(gè)人認(rèn)為是一種 算法思想 , 用來解決多階段多層次的選擇問題,把一個(gè)復(fù)雜的問題分解成每個(gè)小塊的子問題然后一個(gè)個(gè)解決來找到最優(yōu)解。 ? ? DP適用 重疊子問題 和 最優(yōu)子結(jié)構(gòu)的性質(zhì) 的問題。 ? ? DP問題范圍分為 線性與非線性

    2024年02月03日
    瀏覽(20)
  • 藍(lán)橋杯備賽之動態(tài)規(guī)劃篇——涂色問題(區(qū)間DP)

    藍(lán)橋杯備賽之動態(tài)規(guī)劃篇——涂色問題(區(qū)間DP)

    2023第十四屆藍(lán)橋杯模擬賽第二期個(gè)人題解(Java實(shí)現(xiàn)) 2023第十四屆藍(lán)橋杯模擬賽第三期個(gè)人題解(Java實(shí)現(xiàn)) 藍(lán)橋杯備賽之動態(tài)規(guī)劃篇——背包問題 藍(lán)橋杯真題——單詞分析(Java實(shí)現(xiàn)) ???? 哈嘍,大家好!這里是藍(lán)橋杯系列文章的動態(tài)規(guī)劃章節(jié)????,今天要講解的是區(qū)

    2024年01月23日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包