動態路徑規劃——01背包問題講解和通過滾動數組優化

? ? ? ? 如果沒有動態路徑規劃基礎的兄弟可以出去了,這個題目有兩個問題

? ? ? ? 第一問講解:

? ? ? ? 1.定義狀態表示

? ? ? ? 剛開始我做的時候根據我的經驗定義了一個狀態表示dp[i]表示從1到i個物品中選擇的最大價值,但是這個狀態表示有一個明顯的問題,我怎么知道第i個物品可不可以放入背包?

? ? ? ? 所以這個一維的狀態表示顯然是不夠的,在上面的時候其實我們只需要知道第i個物品能不能放入背包其實狀態表示就完全了,故我們用二維的dp[i][j]來進行狀態表示,它表示從1到i個物品中選擇容積小于等于j的最大價值

? ? ? ? 2.狀態轉移方程的推導

? ? ? ? 對于第i個物品我們只有兩種選擇,要么拿要么不拿

? ? ? ? 2.1 當我們不拿時那么我們的dp[i][j]顯然和dp[i-1][j]是相等的

? ? ? ? 2.2 當我們拿時需要先判斷空間夠不夠,如果空間足夠那么

????????????????dp[i][j] = max(dp[i-1][j-v[i]]+w[i],dp[i][j])

????????3.初始化

? ? ? ? 3.1 當i為0時說明沒有物品那么容積小于等于j的最大價值其實就是0

? ? ? ? 3.2 當j為0時說明容積為0那么最大價值也是0

? ? ? ? 4.填表順序

? ? ? ? 觀察狀態轉移方程,我們發現dp[i][j]j會用到前一行的數據(這里是我們后面優化的關鍵),所以我們的填表順序是從上往下、從左往右。

#include<iostream>using namespace std;const int N = 1010;int n,V,v[N],w[N];
int dp[N][N];int main()
{int ret1 = 0;cin>>n>>V;for(int i = 1;i<=n;i++) cin>>v[i]>>w[i];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]) dp[i][j] = max(dp[i][j],dp[i-1][j-v[i]]+w[i]);ret1 = max(ret1,dp[i][j]);}cout<<ret1<<endl;return 0;
}

? ? ? ? 第二問講解

? ? ? ? 1.定義狀態表示

? ? ? ? 與第一問很像,但是這是并不是容積小于等于j的最大價值而是容積等于j的最大價值

? ? ? ? 2.狀態轉移方程

? ? ? ? 和第一問差不多,但是我們需要設定一個值來表示從1到i選不到容積為j的情況這里用-1來表示

? ? ? ? 那么對于第i個位置同樣有兩種情況

? ? ? ? 2,1 當我們不拿第i個物品時價值為dp[i-1][j](這里已經將選不到容積為j的情況包括)

? ? ? ? 2.2 當我們如果要拿第i個物品時,那么我們首先當然是先判斷空間j夠不夠,然后還要判斷

dp[i-1][j-v[i]]這個位置是否有意義即是否為-1,如果有意義那么

? ? ? ??dp[i][j] = max(dp[i-1][j-v[i]]+w[i],dp[i][j])

? ? ? ? 3.初始化

? ? ? ? 這里當i == 0時如果要選擇容積等于j的最大價值顯然是沒有意義的所以我們將dp[0][j](j>=1&&j<=V)初始化為-1

? ? ? ? 當j == 0時只需要不選擇物品即可所以初始化dp[i][0](i >= 1&&i<=n)為0

? ? ? ? 4.填表順序同上

 for(int i = 1;i<=V;i++) dp[0][i] = -1;int ret2 = -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] && (dp[i-1][j-v[i]] != -1))dp[i][j] = max(dp[i][j],dp[i-1][j-v[i]]+w[i]);}for(int i = 1;i<=n;i++) ret2 = max(ret2,dp[i][V]);if(ret2 == -1) cout<<0<<endl;else cout<<ret2<<endl;

下面講講這個算法的優化

????????我們在填表的時候發現只用到了相鄰的兩行其實這里可以用滾動數組來優化,只需要一個dp[N]即可當我們填表時只需要在原表操作,但是我們的填表順序變為了從右往左因為在填dp[i][j]時我們用到了dp[i-1][j]和dp[i-1][j-v[i]]顯然dp[i-1][j-v[i]]位置在dp[i-1][j]前面所以如果從左往右填表會導致在填后一個位置的時候前面的位置的值已經被更新

#include<iostream>using namespace std;const int N = 1010;int n,V,v[N],w[N];
int dp[N];int main()
{int ret1 = 0;cin>>n>>V;for(int i = 1;i<=n;i++) cin>>v[i]>>w[i];for(int i = 1;i<=n;i++)for(int j = V;j>=v[i];j--){dp[j] = max(dp[j],dp[j-v[i]]+w[i]);ret1 = max(ret1,dp[j]);}cout<<ret1<<endl;//第二問的初始化for(int i = 1;i<=V;i++) dp[i] = -1;int ret2 = -1;for(int i = 1;i<=n;i++)for(int j = V;j>=v[i];j--){if((dp[j-v[i]] != -1))dp[j] = max(dp[j],dp[j-v[i]]+w[i]);}for(int i = 1;i<=n;i++) ret2 = max(ret2,dp[V]);if(ret2 == -1) cout<<0<<endl;else cout<<ret2<<endl;return 0;
}

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

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

相關文章

Java程序的邏輯控制

目錄 1、順序結構2、分支結構2.1、if 語句2.2、switch 語句 3、循環結構3.1、while 語句3.2、break3.3、continue3.4、for 循環3.5、do while 語句 1、順序結構 順序結構比較簡單&#xff0c;按照代碼書寫的順序一行一行執行。如果調整代碼的書寫順序, 則執行順序也發生變化。…

【鴻蒙開發】Hi3861學習筆記- GPIO之LED

00. 目錄 文章目錄 00. 目錄01. GPIO概述02. 硬件設計03. 軟件設計04. 實驗現象05. 附錄 01. GPIO概述 GPIO&#xff08;General-purpose input/output&#xff09;即通用型輸入輸出。通常&#xff0c;GPIO控制器通過分組的方式管理所有GPIO管腳&#xff0c;每組GPIO有一個或多…

你的完美主義:從缺陷到超能力

所屬專欄&#xff1a;《邏輯辨證系列》 前情回顧&#xff1a; 《完美還是完成》&#xff08;一&#xff09;&#xff1a;完成還是完美—完成大于完美 時間、機會、情緒成本 先完成 … 本期&#xff1a; 《完美還是完成》&#xff08;二&#xff09;&#xff1a;你的完美主…

438.找出字符串中所有字母異位詞

題目&#xff1a; 給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba&q…

win32匯編環境,對話框程序中創建托盤示例一

;運行效果 ;win32匯編環境,對話框程序中創建托盤示例一 ;托盤&#xff0c;就是電腦桌面右下角那個角落里的圖標&#xff0c;這里展示基本的應用方法。 ;直接抄進RadAsm可編譯運行。重要部分加備注。 ;下面為asm文件 ;>>>>>>>>>>>>>>…

Ansible相關工具:ansible-doc、ansible

文章目錄 管理方式相關工具ansible-doc命令用法案例 ansibleansible主配置文件日志文件主機清單 ansible命令基本格式&#xff1a;選項說明&#xff1a;ansible的Host-pattern或關系邏輯與邏輯非正則表達式 ansible命令執行過程ansible 的執行狀態 管理方式 利用ansible實現管…

LeetCode 熱題 100_前 K 個高頻元素(73_347_中等_C++)(堆)(哈希表+排序;哈希表+優先隊列(小根堆))

LeetCode 熱題 100_前 K 個高頻元素&#xff08;73_347&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;哈希表排序&#xff09;&#xff1a;思路二&#xff08;哈希表優先隊列&#xff08;小根堆&#xff0…

使用Python在Word中生成多種不同類型的圖表

目錄 工具與環境配置 在 Word 中創建圖表的步驟 在Word中創建柱形圖 在Word中創建條形圖 在Word中創建折線圖 在Word中創建餅圖 在Word中創建散點圖 在Word中創建氣泡圖 在 Word 文檔中插入圖表不僅能更直觀地呈現數據&#xff0c;還能提升文檔的可讀性和專業性。常見的…

項目-個人博客測試報告

目錄 一、項目背景 二、項目功能 三、測試計劃 &#xff08;1&#xff09;功能測試 &#xff08;2&#xff09;自動化測試 &#xff08;3&#xff09;性能測試 一、項目背景 1、個人博客系統是一個操作簡單的基于Spring前后端分離的項目&#xff0c;同時使用MySQL數據庫來進…

前端npm包- CropperJS

文章目錄 一、CropperJS**核心特性****官網與文檔****安裝與使用**1. **通過 npm/yarn/pnpm 安裝**2. **HTML 結構**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相關插件/替代方案****適用場景****注意事項** 總結 一、CropperJS cropperjs 是一個輕量級、功能強大的 圖片裁…

楊輝三角形(信息學奧賽一本通-2043)

【題目描述】 例5.11 打印楊輝三角形的前n(2≤n≤20)行。楊輝三角形如下圖&#xff1a; 當n5時 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 輸出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【輸入】 輸入行數n。 【輸出】 輸出如題述三角形。n行&#…

圖論入門【數據結構基礎】:什么是圖?如何表示圖?

圖&#xff08;Graph&#xff09; 是一種非線性數據結構&#xff0c;用于表示對象之間的關系。圖由 頂點&#xff08;Vertex&#xff09; 和 邊&#xff08;Edge&#xff09; 組成&#xff0c;其中頂點表示對象&#xff0c;邊表示對象之間的關系。圖廣泛應用于計算機科學、數學…

如何使用HACS一鍵集成米家與果家設備到HomeAssistant玩轉智能家居

文章目錄 前言1. 下載HACS源碼2. 添加HACS商店3. 綁定米家設備 前言 各位科技潮人和智能家居發燒友們&#xff0c;是不是也夢想著把家里變成一個高科技的空間&#xff1f;有了群暉NAS這位得力助手&#xff0c;不僅存儲空間大得嚇人&#xff0c;還能通過Docker輕松安裝各種應用…

《Java對象“比武場“:Comparable與Comparator的巔峰對決》

目錄 引言&#xff1a; 一、認識接口 1.1 Comparable 1.2 Comparator ?編輯 1.3 核心概念對比 二、代碼實現對比 2.1 Comparable 實現示例 2.2 Comparator 實例示例 三、核心區別詳解 3.1 設計理念差異 3.2 方法調用 3.3 使用情景 四、本質區別總結 引言&#x…

Android自動化測試工具

細解自動化測試工具 Airtest-CSDN博客 以下是幾種常見的Android應用自動化測試工具&#xff1a; Appium&#xff1a;支持多種編程語言&#xff0c;如Java、Python、Ruby、JavaScript等。可以用于Web應用程序和原生應用程序的自動化測試&#xff0c;并支持iOS和Android平臺。E…

Go vs Rust vs C++ vs Python vs Java:誰主后端沉浮

一、核心性能對比(基于TechEmpower基準測試) 語言單核QPS延遲(ms)內存消耗適用場景Rust650,0000.1245MB高頻交易/區塊鏈C++720,0000.0932MB游戲服務器/實時渲染Go230,0000.45110MB微服務/API網關Java180,0001.2450MB企業ERP/銀行系統Python12,0008.5220MBAI接口/快速原型技術…

vue3:八、登錄界面實現-頁面初始搭建、基礎實現

一、初始工作 1、創建登錄文件 在src/views中創建文件LoginView.vue文件 2、創建路由 在router/index.js中增加登錄的信息 代碼 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue const router createRouter({hist…

結構型模式之適配器模式:讓不兼容的接口兼容

在軟件開發中&#xff0c;經常會遇到這樣一種情況&#xff1a;系統的不同部分需要進行交互&#xff0c;但由于接口不兼容&#xff0c;導致無法直接使用。這時&#xff0c;適配器模式&#xff08;Adapter Pattern&#xff09;就能派上用場。適配器模式是設計模式中的結構型模式&…

Qt從入門到入土(十) -數據庫操作--SQLITE

認識 數據庫是用于存儲、管理和檢索數據的系統化集合。它是一種按照特定結構組織數據的存儲方式&#xff0c;通過軟件&#xff08;數據庫管理系統&#xff0c;DBMS&#xff09;來實現數據的高效存儲、查詢、更新和管理。通過文件存儲數據適用于少量的數據&#xff0c;而當擁有…

Django REST Framework中的序列化器類和視圖類

序列化器類 一、Serializer序列化類 Serializer是DRF的序列化器基類&#xff0c;提供基本功能&#xff0c;使用Serializer類需要自己定義字段名稱和類型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…