藍橋杯C++基礎算法-0-1背包(優化為一維)

這段代碼實現了0-1 背包問題的動態規劃解法,并且使用了滾動數組來優化空間復雜度。以下是代碼的詳細思路解析:


1. 問題背景

給定 n 個物品,每個物品有其體積 v[i] 和價值 w[i],以及一個容量為 m 的背包。目標是選擇物品使得總價值最大,同時總容量不超過背包的容量。

2. 動態規劃的概念

動態規劃是一種常用的算法技巧,用于解決具有重疊子問題和最優子結構的問題。在 0-1 背包問題中,動態規劃通過維護一個一維數組 f 來記錄不同狀態下的最大價值。

3. 代碼邏輯解析

(1) 輸入數據
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
  • 用戶輸入物品數量 n 和背包容量 m

  • 對于每個物品,輸入其體積 v[i] 和價值 w[i]

(2) 動態規劃狀態轉移
for (int i = 1; i <= n; i++)for (int j = m; j >= v[i]; j--)f[j] = max(f[j], f[j - v[i]] + w[i]);
  1. 外層循環

    • 遍歷每個物品,從第 1 個到第 n 個。

  2. 內層循環

    • 遍歷背包的每個容量,從 mv[i](逆序遍歷)。

    • 逆序遍歷的原因是避免重復使用同一個物品。如果正序遍歷,同一個物品可能會被多次使用,從而變成完全背包問題。

  3. 狀態轉移

    • f[j] 表示在容量為 j 的背包下的最大價值。

    • 不選擇第 i 個物品f[j] 保持不變。

    • 選擇第 i 個物品:如果當前容量 j 大于等于第 i 個物品的體積 v[i],則可以考慮選擇第 i 個物品,更新 f[j]f[j - v[i]] + w[i],即在容量為 j - v[i] 的背包下的最大價值加上第 i 個物品的價值。

(3) 輸出結果
cout << f[m] << endl;
  • 輸出最終的最大價值,即 f[m]

4. 代碼效率分析

  • 時間復雜度

    • 兩層循環遍歷所有物品和所有容量,時間復雜度為 O(n × m)

  • 空間復雜度

    • 使用了一個一維數組 f,空間復雜度為 O(m)

5. 示例運行

輸入:
3 5
1 2
2 3
3 4
運行過程:
  1. 輸入數據

    • n = 3, m = 5

    • v = [1, 2, 3], w = [2, 3, 4]

  2. 動態規劃狀態轉移

    • 初始化 f 數組為 0。

    • 對于第 1 個物品:

      • f[5] = max(f[5], f[4] + 2) = 2

      • f[4] = max(f[4], f[3] + 2) = 2

      • f[3] = max(f[3], f[2] + 2) = 2

      • f[2] = max(f[2], f[1] + 2) = 2

      • f[1] = max(f[1], f[0] + 2) = 2

    • 對于第 2 個物品:

      • f[5] = max(f[5], f[3] + 3) = 5

      • f[4] = max(f[4], f[2] + 3) = 5

      • f[3] = max(f[3], f[1] + 3) = 5

      • f[2] = max(f[2], f[0] + 3) = 3

    • 對于第 3 個物品:

      • f[5] = max(f[5], f[2] + 4) = 7

      • f[4] = max(f[4], f[1] + 4) = 6

      • f[3] = max(f[3], f[0] + 4) = 4

輸出:
7

6. 總結

這段代碼的核心思路是通過動態規劃解決 0-1 背包問題,并使用滾動數組優化空間復雜度。通過維護一個一維數組 f,記錄不同狀態下的最大價值,并通過狀態轉移方程更新最大價值,最終找到在給定背包容量下的最大價值。這種方法的時間復雜度為 O(n × m),空間復雜度為 O(m),適用于中等規模的 0-1 背包問題。

完整代碼

#include<bits/stdc++.h>
using namespace std;// 定義數組的最大長度
const int N = 1010;
// n 代表物品的數量,m 代表背包的容量
int n, m;
// v 數組用來存儲每個物品的體積,w 數組用來存儲每個物品的價值
int v[N], w[N];
// f 數組是一維數組,f[j] 表示背包容量為 j 時能獲得的最大價值
int f[N];int main()
{// 輸入物品的數量 n 和背包的容量 mcin >> n >> m;// 循環讀入每個物品的體積和價值for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i];// 動態規劃過程,外層循環遍歷每個物品for(int i = 1; i <= n; i ++)// 內層循環從背包的最大容量 m 開始,遞減到當前物品的體積 v[i]for(int j = m; j >= v[i]; j --)// 比較不選擇第 i 個物品和選擇第 i 個物品兩種情況下的最大價值// 不選擇第 i 個物品時,f[j] 保持不變// 選擇第 i 個物品時,價值為 f[j - v[i]] + w[i]f[j] = max(f[j], f[j - v[i]] + w[i]);// 輸出背包容量為 m 時能獲得的最大價值cout << f[m] << endl;return 0;
}

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

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

相關文章

算法 | 麻雀搜索算法原理,公式,改進算法綜述,應用場景及matlab完整代碼

一、麻雀搜索算法(SSA)原理 1. 算法基礎 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一種群體智能優化算法,靈感來源于麻雀群體的覓食與反捕食行為。算法將麻雀分為三類角色:發現者(Producer):適應度最高,負責探索全局最優區域;加入者(Follower)…

SQL 版本歷史

SQL&#xff08;Structured Query Language&#xff09;是一種用于管理和操作關系數據庫的標準語言。SQL標準由多個組織制定和維護&#xff0c;主要包括以下幾個版本&#xff1a; SQL-86 (SQL-87): 這是SQL的第一個官方標準&#xff0c;由ANSI&#xff08;美國國家標準協會&…

CAT1模塊 EC800M HTTP 使用后續記錄

記錄一下 CAT1 模塊EC800 HTTP 使用后續遇到的問題 by 矜辰所致目錄 前言一、一些功能的完善1.1 新的交互指令添加1.2 連不上網絡處理 二、問題出現三、分析及解決3.1 定位問題3.2 問題分析與解決3.2.1 查看變量在內存中的位置 3.3 數據類型說明3.3.1 常用格式化輸出符號…

單純形法之大M法

1. 問題背景與標準化 在求解某些線性規劃問題時&#xff0c;往往難以直接找到初始的基本可行解。特別是當約束中存在等式或 “≥” 類型的不等式時&#xff0c;我們需要引入人工變量來構造一個初始可行解。 考慮如下標準形式問題&#xff08;假設為最大化問題&#xff09;&am…

Springboot集成Debezium監聽postgresql變更

1.創建springboot項目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…

報錯 standard_init_linux.go:228: exec user process caused: exec format error

docker logs 容器名 報錯&#xff1a; standard_init_linux.go:228: exec user process caused: exec format error 或者 standard_init_linux.go:228: exec user process caused: input/output error 排查思路 1、檢查源鏡像的框架是否正確&#xff0c;是否amd64&#x…

Go 代理爬蟲

現在注冊&#xff0c;還送15美金注冊獎勵金 --- 亮數據-網絡IP代理及全網數據一站式服務商 使用代理服務器&#xff0c;通過 Colly、Goquery、Selenium 進行網絡爬蟲的基礎示例程序 本倉庫包含兩個分支&#xff1a; basic 分支包含供 Go Proxy Servers 這篇文章改動的基礎代碼…

STM32實現智能溫控系統(暖手寶):PID 算法 + DS18B20+OLED 顯示,[學習 PID 優質項目]

一、項目概述 本文基于 STM32F103C8T6 單片機&#xff0c;設計了一個高精度溫度控制系統。通過 DS18B20 采集溫度&#xff0c;采用位置型 PID 算法控制 PWM 輸出驅動 MOS 管加熱Pi膜&#xff0c;配合 OLED 實時顯示溫度數據。系統可穩定將 PI 膜加熱至 40℃&#xff0c;適用于…

neo4j知識圖譜常用命令

1. 查看所有節點和關系 如果你想查看圖數據庫中的所有節點和關系&#xff0c;可以使用以下查詢&#xff1a; Cypher 深色版本 MATCH (n)-[r]->(m) RETURN n, r, m n 和 m 表示節點。r 表示兩個節點之間的關系。這條命令會返回所有節點及其直接相連的關系。 2. 查看所有節…

從零開始:使用Luatools工具高效燒錄Air780EPM核心板項目的完整指南

本文將深入講解如何使用Luatools工具燒錄一個具體的項目到Air780EPM開發板中。如何使用官方推薦的Luatools工具&#xff08;一款跨平臺、命令行驅動的燒錄利器&#xff09;&#xff0c;通過“環境配置→硬件連接→參數設置→一鍵燒錄”四大步驟&#xff0c;幫助用戶實現Air780E…

2024年認證杯SPSSPRO杯數學建模C題(第二階段)云中的海鹽全過程文檔及程序

2024年認證杯SPSSPRO杯數學建模 C題 云中的海鹽 原題再現&#xff1a; 巴黎氣候協定提出的目標是&#xff1a;在2100年前&#xff0c;把全球平均氣溫相對于工業革命以前的氣溫升幅控制在不超過2攝氏度的水平&#xff0c;并為1.5攝氏度而努力。但事實上&#xff0c;許多之前的…

大疆上云api介紹

概述 目前對于 DJI 無人機接入第三方云平臺,主要是基于 MSDK 開發定制 App,然后自己定義私有上云通信協議連接到云平臺中。這樣對于核心業務是開發云平臺,無人機只是其中一個接入硬件設備的開發者來說,重新基于 MSDK 開發 App 工作量大、成本高,同時還需要花很多精力在無人…

云原生之開源遙測框架OpenTelemetry(在 Gin 框架中使用 OpenTelemetry 進行分布式追蹤和監控)

文章目錄 云原生之開源遙測框架OpenTelemetry背景什么是可觀測性&#xff1f; 什么是 OpenTelemetry&#xff1f;Opentelemetry的主要優勢有以下幾點&#xff1a;理解分布式鏈路日志Spans分布式鏈路 在 Gin 框架中使用 OpenTelemetry 進行分布式追蹤和監控0. 整體思路1. 初始化…

【藍橋杯速成】| 11.回溯 之 子集問題

題目一&#xff1a;子集 問題描述 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums &#xff0c;數組中的元素 互不相同 。返回該數組所有可能的子集&#xff08;冪集&#xff09;。 解集 不能 包含重復的子集。你可以按 任意順序 返回解集。 示例…

Nginx目錄結構

Nginx目錄結構 ? Nginx 的安裝目錄結構可能會因安裝方式&#xff08;如使用包管理器、源碼編譯等&#xff09;和操作系統的不同而有所差異。以下是通過在線安裝時&#xff0c;Nginx 默認的目錄結構&#xff0c;以及各目錄和文件的作用。 yum install nginx查詢nginx [rootRo…

2.(vue3.x+vite)使用vue-router

前端技術社區總目錄(訂閱之前請先查看該博客) 效果預覽 路由配置的“/”與“helloWorld”都可以訪問到以下內容 http://10.11.0.87:4000/#/ http://10.11.0.87:4000/#/helloWorld 1:安裝vue-router npm i vue-router 2:創建router文件 在src的目錄下創建router文件夾…

后端返回了 xlsx 文件流,前端怎么下載處理

當后端返回一個 .xlsx 文件流時&#xff0c;前端可以通過 JavaScript 處理這個文件流并觸發瀏覽器下載。 實現步驟 發送請求獲取文件流&#xff1a; 使用 fetch 或 axios 等工具向后端發送請求&#xff0c;確保響應類型設置為 blob&#xff08;二進制數據流&#xff09;。 創建…

HTML5拖拽功能教程

HTML5拖拽功能教程 簡介 HTML5引入了原生拖放(Drag and Drop)API&#xff0c;使開發者能夠輕松實現網頁中的拖拽功能&#xff0c;無需依賴第三方庫。拖拽功能可以大大提升用戶體驗&#xff0c;適用于文件上傳、列表排序、看板系統等多種交互場景。本教程將帶您全面了解HTML拖…

VUE3 路由配置

1.下載 VueRouter 模塊 在命令行中輸入 yarn add vue-router 2.導?相關函數 在自己創建的router/index.js 文件中 import { createRouter, createWebHashHistory } from vue-router 3.創建路由實例 在自己創建的router/index.js 文件中 const theFirstRouter ()>{return…

歷史序列影像 Esri的World Imagery Wayback簡介

Esri的World Imagery Wayback是一個專注于提供歷史衛星影像的在線平臺&#xff0c;由全球領先的地理信息系統&#xff08;GIS&#xff09;技術提供商Esri開發。該平臺整合了多源衛星影像數據&#xff0c;允許用戶回溯特定區域在不同時間點的影像變化&#xff0c;支持時間序列分…