代碼隨想錄算法訓練營第四十四天 完全背包 、零錢兌換 II 、組合總和 Ⅳ

代碼隨想錄算法訓練營第四十四天 | 完全背包 、零錢兌換 II 、組合總和 Ⅳ

完全背包

題目鏈接:題目頁面 (kamacoder.com)

解釋一、01背包 一維 :為什么要倒序遍歷背包

首先要明白二維數組的遞推過程,然后才能看懂二維變一維的過程。

假設目前有背包容量為10,可以裝的最大價值, 記為g(10)。

即將進來的物品重量為6。價值為9。
那么此時可以選擇裝該物品或者不裝該物品。

如果不裝該物品,顯然背包容量無變化,這里對應二維數組,其實就是取該格子上方的格子復制下來,就是所說的滾動下來,直接g【10】 = g【10】,這兩個g【10】要搞清楚,右邊的g【10】是上一輪記錄的,也就是對應二維數組里上一層的值,而左邊是新的g【10】,也就是對應二維數組里下一層的值。

如果裝該物品,則背包容量= g(10-6) = g(4) + 9 ,也就是 g(10) = g(4) + 6 ,這里的6顯然就是新進來的物品的價值,g(10)就是新記錄的,對應二維數組里下一層的值,而這里的g(4)是對應二維數組里上一層的值,通俗的來講:你要找到上一層也就是上一狀態下 背包容量為4時的能裝的最大價值,用它來更新下一層的這一狀態,也就是加入了價值為9的物品的新狀態。

這時候如果是正序遍歷會怎么樣? g(10) = g(4) + 6 ,這個式子里的g(4)就不再是上一層的了,因為你是正序啊,g(4) 比g(10)提前更新,那么此時程序已經沒法讀取到上一層的g(4)了,新更新的下一層的g(4)覆蓋掉了,這里也就是為啥有題解說一件物品被拿了兩次的原因

解釋二、01背包到底先遍歷物品還是先遍歷背包呢?

其實在二維的時候,即使是先遍歷背包重量,再遍歷物品重量,你真的畫圖的時候會發現,永遠的數據來源,依舊還是max(不放,放)= max(正上方的值,左上角的值)。

那你在一維的時候,如果先遍歷背包容量的話:

如果你還是從左到右地遍歷背包容量:一樣會造成重復添加;

如果你從右到左地遍歷背包容量:相當于你的計算順序是先豎著寫完第四列,再豎著寫完第三列,再豎著寫完第二列。。。但你寫第四列的時候,第三列全部都是空的,左邊是沒有數據的,你永遠只在累加正上方的數。而如果你是先遍歷物品再遍歷背包,你的填空順序是,先寫第一行(從右往左寫),再寫第二行的時候,你的左邊是有數字的。。。

那你可能想問,我能不能做一個豎著的表格更新呢?其實沒有幫助的,你只要先一股腦地豎著算,你永遠沒法利用起左邊格子的數字——無法利用之前格子的數,那就不是動態規劃了

解釋三、為什么完全背包可以顛倒物品和背包的遍歷順序?

請想像一下 01背包的二維dp數組圖像 和 完全背包的二維dp數組圖像

01背包二維數組dp[i] [j]只取決于其左上角的值,所以 使用二維數組時可以從對物品和背包數組進行正序遍歷,且先物品還是先背包可以顛倒

01背包一維數組dp[j] 因為

背包必須要倒序遍歷(參考上面解釋一、01背包 一維 :為什么要倒序遍歷背包

如果遍歷背包容量放在上一層,那么每個dp[j]就只會放入一個物品,即:背包里只放入了一個物品(解釋二

所以要先物品后背包

完全背包其dp[j]完全取決于

// 先遍歷物品再遍歷背包
import java.util.*;public class Main {public static void main (String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int V = sc.nextInt();int[] weights = new int[N];int[] values = new int[N];for(int i = 0; i < N; ++i) {weights[i] = sc.nextInt();values[i] = sc.nextInt();}int[] dp = new int[V + 1];for(int i = 0; i < N; ++i) {for(int j = weights[i]; j <= V; ++j) {dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);}}System.out.println(dp[V]);}
}
// 先遍歷背包再遍歷物品
import java.util.*;public class Main {public static void main (String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int V = sc.nextInt();int[] weights = new int[N];int[] values = new int[N];for(int i = 0; i < N; ++i) {weights[i] = sc.nextInt();values[i] = sc.nextInt();}int[] dp = new int[V + 1];for(int j = 1; j <= V; ++j) {for(int i = 0; i < N; ++i) {if(j >= weights[i]) {dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);}                }}System.out.println(dp[V]);}
}

零錢兌換 II

題目鏈接:518. 零錢兌換 II - 力扣(LeetCode)

這道題就是 494. 目標和 - 力扣(LeetCode)的完全背包版本

如果求組合數就是外層for循環遍歷物品,內層for遍歷背包

如果求排列數就是外層for遍歷背包,內層for循環遍歷物品

class Solution {public int change(int amount, int[] coins) {//  硬幣數量不限 -> 完全背包// dp[j] 表示:填滿j(包括j)這么大容積的包,有dp[j]種方法int[] dp = new int[amount + 1];// dp[0] = 1是 遞歸公式的基礎。如果dp[0] = 0 的話,后面所有推導出來的值都是0了。dp[0] = 1;// 因為純完全背包求得裝滿背包的最大價值是多少,和湊成總和的元素有沒有順序沒關系,即:有順序也行,沒有順序也行!// 而本題要求湊成總和的組合數,元素之間明確要求沒有順序/**以coins[0] = 1, coins[1] = 5, amount = 6為例先遍歷物品,就是先把1加入計算,然后再把5加入計算 -> 這樣得到的是 組合先遍歷背包,背包容量的每一個值,都是經過 1 和 5 的計算,包含了{1, 5} 和 {5, 1}兩種情況-> 這樣得到的是 排列 不理解的話可以打印dp數組來看看*/for(int i = 0; i < coins.length; ++i) {for(int j = coins[i]; j <= amount; ++j) {dp[j] += dp[j - coins[i]];}for(int ele : dp) {System.out.print(ele + ",");}System.out.println(" ");}return dp[amount];}
}  

組合總和 Ⅳ

題目鏈接:377. 組合總和 Ⅳ - 力扣(LeetCode)

本題與動態規劃:518.零錢兌換II (opens new window)就是一個鮮明的對比,一個是求排列,一個是求組合,遍歷順序完全不同

class Solution {public int combinationSum4(int[] nums, int target) {int[] dp = new int[target + 1];dp[0] = 1;for (int i = 0; i <= target; i++) {for (int j = 0; j < nums.length; j++) {if (i >= nums[j]) {dp[i] += dp[i - nums[j]];}}}return dp[target];}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715190.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MATLAB源碼-第150期】基于matlab的開普勒優化算法(KOA)機器人柵格路徑規劃,輸出做短路徑圖和適應度曲線。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 開普勒優化算法&#xff08;Kepler Optimization Algorithm, KOA&#xff09;是一個虛構的、靈感來自天文學的優化算法&#xff0c;它借鑒了開普勒行星運動定律的概念來設計。在這個構想中&#xff0c;算法模仿行星圍繞太陽的…

項目風險:測試大佬結合實例告訴你如何應對!

項目有風險 今天下午15點&#xff0c;團隊成員D向他的主管Z反饋他測試的項目有風險&#xff1a;項目在測試周期內&#xff0c;但在用例評審時發現有一處功能邏輯有爭議&#xff0c;需要產品經理跟業務方確認&#xff0c;可能出現的情況有&#xff1a; 1 不變更需求&#xff0…

【技巧】SpringCloud Gateway實現多子域(單個應用開放多個端口)

0. 目錄 1. 需求背景2. 實現3. 額外 - 其它Servlet容器實現3.1 Undertow3.2 Tomcat 4. 相關 1. 需求背景 瀏覽器針對單個網站地址(ipport)存在“6個請求”限制&#xff1b;通過多子域配置可以突破這個限制&#xff0c;增加網站的響應效率&#xff0c;尤其是針對三維服務這類大…

【深入了解設計模式】組合設計模式

組合設計模式 組合模式是一種結構型設計模式&#xff0c;它允許你將對象組合成樹狀結構來表現“整體-部分”關系。組合模式使得客戶端可以統一對待單個對象和組合對象&#xff0c;從而使得代碼更加靈活和易于擴展。 概述 ? 對于這個圖片肯定會非常熟悉&#xff0c;上圖我們可…

Carla自動駕駛仿真九:車輛變道路徑規劃

文章目錄 前言一、關鍵函數二、完整代碼效果 前言 本文介紹一種在carla中比較簡單的變道路徑規劃方法&#xff0c;主要核心是調用carla的GlobalRoutePlanner模塊和PID控制模塊實現變道&#xff0c;大體的框架如下圖所示。 一、關鍵函數 1、get_spawn_point(),該函數根據指定r…

c語言字符串函數之strcpy函數,strnpy函數

strcpy函數 語法格式 strcpy(字符數組1,字符串2&#xff09; 它的作用是把字符串2復制到字符數組1里面 #include<stdio.h> #include<string.h> int main() {char c[]"河南";char d[]"安徽";char d[];printf("%s\n",strcpy(c,d));…

力扣hot100題解(python版41-43題)

41、二叉樹的層序遍歷 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;[[3],[9,20],[15,7]]示例…

【C語言結構體】用戶自定義類型--結構體,結構體傳參,位段,聯合體和枚舉【圖文詳解】

歡迎來CILMY23的博客喔&#xff0c;本篇為【C語言結構體】用戶自定義類型--結構體&#xff0c;結構體傳參&#xff0c;位段&#xff0c;聯合體和枚舉【圖文詳解】&#xff0c;感謝觀看&#xff0c;支持的可以給個一鍵三連&#xff0c;點贊關注收藏。 前言 上一篇&#xff08;ht…

GO—函數

Go 語言支持普通函數、匿名函數和閉包&#xff0c;從設計上對函數進行了優化和改進&#xff0c;讓函數使用起來更加方便。 Go 語言的函數屬于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是說&#xff1a; 函數本身可以作為值進行傳遞。支持匿名函數和閉…

Leetcode.2369 檢查數組是否存在有效劃分

題目鏈接 Leetcode.2369 檢查數組是否存在有效劃分 rating : 1780 題目描述 給你一個下標從 0 0 0 開始的整數數組 n u m s nums nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為…

推薦6款SSH遠程連接工具

1、Xshell 介紹&#xff1a; xshell是一個非常強大的安全終端模擬軟件&#xff0c;它支持SSH1, SSH2, 以及Windows平臺的TELNET 協議。Xshell可以在Windows界面下用來訪問遠端不同系統下的服務器&#xff0c;從而比較好的達到遠程控制終端的目的。 業界最強大的SSH客戶機 官…

數據分析-Pandas數據的直方圖探查

數據分析-Pandas數據的直方圖探查 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&…

農產品質量追溯系統—功能介紹(2)

儲藏管理 儲藏信息管理對需要儲藏的農產品,記錄儲藏的相關信息,如儲藏開始時間、存放倉庫、操作人員、儲藏原因等; 倉庫信息管理物流管理 物流公司管理對相關的物流公司信息進行登記,以便于管理和追溯; 車輛管理

我的秋招數據分析崗面經分享(京東,美團,阿里,拼多多,vivo,滴滴)

節前&#xff0c;我們社群組織了一場技術&面試討論會&#xff0c;邀請了一些互聯網大廠同學、參加社招和校招面試的同學&#xff0c;針對新手如何入門數據分析、機器學習算法、該如何備戰面試、面試常考點分享等熱門話題進行了深入的討論。 基于社群的討論&#xff0c;今天…

力扣爆刷第84天之hot100五連刷6-10

力扣爆刷第84天之hot100五連刷6-10 文章目錄 力扣爆刷第84天之hot100五連刷6-10一、15. 三數之和二、42. 接雨水三、3. 無重復字符的最長子串四、438. 找到字符串中所有字母異位詞五、560. 和為 K 的子數組 一、15. 三數之和 題目鏈接&#xff1a;https://leetcode.cn/problem…

JAVA學習筆記13(位運算)

1.位運算 1.1 原碼、反碼、補碼 ? *規則&#xff1a; ? 1.二進制的最高位是符號位&#xff1a;0表示正數&#xff0c;1表示負數 ? 2.正數的原碼&#xff0c;反碼&#xff0c;補碼都一樣&#xff08;三碼合一&#xff09; ? 3.負數的反碼 他的原碼符號位不變&#xff…

從metashape導出深度圖,從深度圖恢復密集點云

從metashape導出深度圖&#xff0c;從深度圖恢復密集點云 1.從metashape導出深度圖 參考&#xff1a;https://blog.csdn.net/WHU_StudentZhong/article/details/123107072?spm1001.2014.3001.5502 2.從深度圖建立密集點云 首先從metashape導出blockExchange格式的xml文件&…

OpenHarmony、HarmonyOS打開編輯 PDF 等操作的三方組件使用教程

項目場景: 隨著數字化時代的發展,PDF 文檔成為廣泛應用于各行業的重要文件格式。為了提高OpenHarmony/HarmonyOS生態系統的功能性和用戶體驗,我們需要一款支持打開、編輯PDF文件的應用程序。 使用戶能夠輕松打開、瀏覽和編輯PDF文件。該應用將充分利用OpenHarmony/HarmonyO…

【NTN 衛星通信】衛星和無人機配合的應用場景

1 場景概述 衛星接入網是一種有潛力的技術&#xff0c;可以為地面覆蓋差地區的用戶提供無處不在的網絡服務。然而&#xff0c;衛星覆蓋范圍對于位于考古或采礦地點內部/被茂密森林覆蓋的村莊/山谷/靠近山丘或大型建筑物的用戶可能很稀疏。因此&#xff0c;涉及衛星接入和無人駕…

HarmonyOS Full SDK的安裝

OpenHarmony的應用開發工具HUAWEI DevEco Studio現在隨著OpenHarmony版本發布而發布,只能在版本發布說明中下載,例如最新版本的OpenHarmony 4.0 Release。對應的需要下載DevEco Studio 4.0 Release,如下圖。 圖片 下載Full SDK主要有兩種方式,一種是通過DevEco Studio下載…