藍橋杯C++基礎算法-0-1背包

這段代碼實現了一個經典的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 = 0; j <= m; j++){f[i][j] = f[i - 1][j];  // 不選擇第 i 個物品if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);  // 選擇第 i 個物品}
  1. 外層循環

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

  2. 內層循環

    • 遍歷背包的每個容量,從 0 到 m

  3. 狀態轉移

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

    • 不選擇第 i 個物品f[i][j] = f[i - 1][j],即前 i-1 個物品在容量為 j 的背包下的最大價值。

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

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

4. 代碼效率分析

  • 時間復雜度

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

  • 空間復雜度

    • 使用了一個二維數組 f,空間復雜度為 O(n × 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][j] = 0,表示沒有物品時的最大價值為 0。

    • 對于第 1 個物品:

      • f[1][0] = 0

      • f[1][1] = 2

      • f[1][2] = 2

      • f[1][3] = 2

      • f[1][4] = 2

      • f[1][5] = 2

    • 對于第 2 個物品:

      • f[2][0] = 0

      • f[2][1] = 2

      • f[2][2] = 3

      • f[2][3] = 5

      • f[2][4] = 5

      • f[2][5] = 5

    • 對于第 3 個物品:

      • f[3][0] = 0

      • f[3][1] = 2

      • f[3][2] = 3

      • f[3][3] = 5

      • f[3][4] = 6

      • f[3][5] = 7

輸出:
7

6. 總結

這段代碼的核心思路是通過動態規劃解決 0-1 背包問題。通過維護一個二維數組 f,記錄不同狀態下的最大價值,并通過狀態轉移方程更新最大價值,最終找到在給定背包容量下的最大價值。這種方法的時間復雜度為 O(n × 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[i][j] 表示前 i 個物品,背包容量為 j 時能獲得的最大價值
int f[N][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 ++)// 內層循環遍歷背包的所有可能容量for(int j = 0; j <= m; j ++){// 不選擇第 i 個物品,那么前 i 個物品在容量為 j 的背包中的最大價值// 就等于前 i - 1 個物品在容量為 j 的背包中的最大價值f[i][j] = f[i - 1][j];// 如果當前背包的容量 j 大于等于第 i 個物品的體積 v[i]// 說明可以選擇放入第 i 個物品if(j >= v[i]) // 比較不放入第 i 個物品和放入第 i 個物品兩種情況下的最大價值// 放入第 i 個物品的價值為 f[i - 1][j - v[i]] + w[i]f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);}// 輸出前 n 個物品,背包容量為 m 時能獲得的最大價值cout << f[n][m] << endl;return 0;
}

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

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

相關文章

html5炫酷的科技感3D文字效果實現詳解

炫酷的科技感3D文字效果實現詳解 這里寫目錄標題 炫酷的科技感3D文字效果實現詳解項目概述核心技術實現1. 3D文字效果2. 故障藝術效果&#xff08;Glitch Effect&#xff09;3. 動態網格背景4. 掃描線效果5. 粒子效果 性能優化考慮技術難點與解決方案項目總結擴展優化方向 項目…

車道保持中車道線識別

需要讓小車保持車道行駛&#xff0c;首先需要進行車道線識別。 也可參看論文&#xff08;上傳到資源里&#xff09;&#xff1a;自動駕駛汽車車道檢測與預測的技術解析-基于圖像處理和Hough變換的方法 1 車道識別流程 想進行車道線識別&#xff0c;并且希望在圖像中選擇一個特…

英偉達有哪些支持AI繪畫的 工程

英偉達在AI繪畫領域布局廣泛&#xff0c;其自研工具與第三方合作項目共同構建了完整的技術生態。以下是其核心支持AI繪畫的工程及合作項目的詳細介紹&#xff1a; 一、英偉達自研AI繪畫工具 1. GauGAN系列 技術特點&#xff1a;基于生成對抗網絡&#xff08;GAN&#xff09;&…

驅動開發的引入

1.引入 Linux內核的整體架構本就非常龐大&#xff0c;其包含的組件也非常多。而我們怎樣把需要的部分都包含在內核中呢? 一種方法是把所有需要的功能都編譯到Linux內核中。這會導致兩個問題&#xff0c;一是生成的內核會很大&#xff0c;二是如果我們要在現有的內核中新增或刪…

AI日報 - 2025年3月24日

&#x1f31f; 今日概覽&#xff08;60秒速覽&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架構效率驚人 在100生物任務中達最優&#xff0c;推理速度提升高達12萬倍 ▎&#x1f4bc; 商業動向 | OpenAI用戶破4億&#xff0c;Meta與Reliance探討AI合作 生態擴展與全…

VMware上對CentOS7虛擬機進行磁盤擴容、縮容

在VMware 17 Pro上對CentOS 7虛擬機進行磁盤擴容&#xff0c;同時保證原先部署的軟件正常使用&#xff0c;可以按照以下步驟進行操作&#xff1a; 一、擴容 步驟一&#xff1a;關閉虛擬機并在VMware中擴展磁盤容量 關閉虛擬機&#xff1a;在VMware Workstation 17 Pro中&…

.gitignore使用指南

.gitignore使用指南 目錄 什么是.gitignore為什么需要.gitignore如何創建.gitignore文件.gitignore文件的語法規則 忽略單個文件忽略目錄忽略特定類型的文件不忽略特定文件或目錄遞歸匹配 示例.gitignore文件注意事項更多特殊場景匹配規則 忽略多個特定后綴的文件忽略特定目錄…

OpenCV旋轉估計(3)幫助構建一個最大生成樹(Maximum Spanning Tree)函數findMaxSpanningTree()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::findMaxSpanningTree 是 OpenCV 中用于圖像拼接工作流的一個函數&#xff0c;它幫助構建一個最大生成樹&#xff08;Maximum Spanni…

Android在kts中簡單使用AIDL

Android在kts中簡單使用AIDL AIDL相信做Android都有所了解&#xff0c;跨進程通信會經常使用&#xff0c;這里就不展開講解原理跨進程通信的方式了&#xff0c;最近項目換成kts的方式&#xff0c;于是把aidl也換成了統一的方式&#xff0c;其中遇到了很多問題&#xff0c;這里…

論文閱讀:2024-NAACL Semstamp、2024-ACL (Findings) k-SemStamp

總目錄 大模型安全相關研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Semstamp: A semantic watermark with paraphrastic robustness for text generation https://aclanthology.org/2024.naacl-long.226/ k-SemStamp: A Clustering-Based Semantic Wate…

物化視圖詳解:數據庫性能優化的利器

物化視圖&#xff08;Materialized View&#xff09;作為數據庫性能優化的核心手段&#xff0c;通過預計算和存儲查詢結果&#xff0c;顯著提升了復雜查詢的效率。本文將深入剖析物化視圖的工作原理、應用場景及最佳實踐&#xff0c;幫助企業在合適的場景中充分發揮其性能優勢。…

快速入手:Nacos融合SpringCloud成為注冊配置中心

快速入手&#xff1a;Nacos融合SpringCloud成為注冊配置中心 前言安裝Nacos項目搭建添加配置啟動類添加注解運行項目服務調用RestTemplate 模式FeignClient 模式 Gateway 網關 前言 Spring Cloud是一系列框架的集合&#xff0c;提供了微服務架構下的各種解決方案&#xff0c;如…

2025年2月-3月后端go開發找工作感悟

整體感悟 目標 找工作首先要有一個目標&#xff0c;這個目標盡可能的明確&#xff0c;比如我要字節、拼多多之類的公司&#xff0c;還是要去百度、滴滴這樣的&#xff0c;或者目標是創業公司。但是這個目標是會動態調整的&#xff0c;有可能我們的心態發生了變化&#xff0c;一…

Python | 如何在Pandas中刪除常量列

在數據分析中&#xff0c;經常會遇到數據集中始終具有常量值的列&#xff08;即&#xff0c;該列中的所有行包含相同的值&#xff09;。這樣的常量列不提供有意義的信息&#xff0c;可以安全地刪除而不影響分析。 如&#xff1a; 在本文中&#xff0c;我們將探索如何使用Pyth…

5.高頻加熱的原理與常用集成電路介紹

一、高頻加熱的類型 利用高頻電源加熱通常由兩種方法&#xff1a;電介質加熱&#xff08;被加熱物體絕緣&#xff09;與感應加熱&#xff08;被加熱物體導電&#xff09;&#xff0c;詳細解釋如下&#xff1a; 電介質加熱&#xff08;利用高頻電壓的高頻電場導致物體自身分子摩…

串口通信與Modbus通信的區別和聯系

一、定義與定位 1?、串口通信? 是物理層的硬件接口標準&#xff0c;用于實現設備間的?串行數據傳輸?&#xff0c;常見類型包括RS-232、RS-485和RS-422?35。其功能是完成并行數據與串行信號的轉換&#xff0c;并定義電氣特性&#xff08;如電平、傳輸速率&#xff09;?。…

Linux生產者消費者模型

Linux生產者消費者模型 Linux生產者消費者模型詳解生產者消費者模型生產者消費者模型的概念生產者消費者模型的特點生產者消費者模型優點 基于BlockingQueue的生產者消費者模型基于阻塞隊列的生產者消費者模型模擬實現基于阻塞隊列的生產消費模型基礎實現生產者消費者步調調整條…

【中文翻譯】第9章-The Algorithmic Foundations of Differential Privacy

由于GitHub項目僅翻譯到前5章&#xff0c;我們從第6章開始通過大語言模型翻譯&#xff0c;并導出markdown格式。 大模型難免存在錯漏&#xff0c;請讀者指正。 教材原文地址&#xff1a;https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf 9 差分隱私與計算復雜度 到目…

【AI大模型】搭建本地大模型GPT-NeoX:詳細步驟及常見問題處理

搭建本地大模型GPT-NeoX:詳細步驟及常見問題處理 GPT-NeoX是一個開源的大型語言模型框架,由EleutherAI開發,可用于訓練和部署類似GPT-3的大型語言模型。本指南將詳細介紹如何在本地環境中搭建GPT-NeoX,并解決過程中可能遇到的常見問題。 1. 系統要求 1.1 硬件要求 1.2 軟…

Unity跨平臺構建快速回顧

知識點來源&#xff1a;人間自有韜哥在&#xff0c;豆包 目錄 一、發布應用程序1. 修改發布必備設置1.1 打開設置面板1.2 修改公司名、游戲項目名、版本號和默認圖標1.3 修改 Package Name 和 Minimum API Level 2. 發布應用程序2.1 配置 Build Settings2.2 選擇發布選項2.3 構…