藍橋杯C++基礎算法-多重背包

這段代碼實現了一個多重背包問題的動態規劃解法。多重背包問題與完全背包問題類似,但每個物品有其數量限制。以下是代碼的詳細思路解析:


1. 問題背景

給定 n 個物品,每個物品有其體積 v[i]、價值 w[i] 和數量 s[i],以及一個容量為 m 的背包。目標是選擇物品使得總價值最大,同時總容量不超過背包的容量。與完全背包問題不同的是,多重背包問題中每個物品的數量是有限的。

2. 動態規劃的概念

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

3. 代碼邏輯解析

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

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

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

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

  2. 中層循環

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

  3. 內層循環

    • 遍歷每個物品可以被選擇的次數 k,從 0 到 s[i](即當前物品的最大數量),并且確保 k * v[i] <= j(即當前容量可以容納的最大次數)。

  4. 狀態轉移

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

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

    • 選擇第 i 個物品 k:更新 f[i][j]f[i - 1][j - v[i] * k] + w[i] * k,即前 i-1 個物品在容量為 j - v[i] * k 的背包下的最大價值加上第 i 個物品的價值乘以選擇次數 k

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

4. 代碼效率分析

  • 時間復雜度

    • 三層循環遍歷所有物品、所有容量和所有選擇次數,時間復雜度為 O(n × m × s_max),其中 s_max 是最大的物品數量。

  • 空間復雜度

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

5. 示例運行

輸入:
4 5
1 2 3
2 4 1
3 4 3
4 5 2
輸出:
10

6. 總結

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

完整代碼

#include<bits/stdc++.h>
using namespace std;// 定義常量 N 作為數組的最大長度
const int N = 110;
// n 表示物品的種類數,m 表示背包的容量
int n, m;
// v 數組存儲每種物品的體積,w 數組存儲每種物品的價值,s 數組存儲每種物品的數量上限
int v[N], w[N], s[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] >> s[i];// 動態規劃過程,外層循環遍歷每種物品for(int i = 1; i <= n; i ++)// 中層循環遍歷背包的所有可能容量for(int j = 0; j <= m; j ++)// 內層循環枚舉當前物品 i 放入的數量 k,k 要滿足不超過該物品的數量上限 s[i] 且放入 k 個物品后的體積不超過當前背包容量 jfor(int k = 0; k <= s[i] && k * v[i] <= j; k ++)// 比較當前記錄的最大價值 f[i][j] 和放入 k 個第 i 種物品后的價值// 放入 k 個第 i 種物品后,剩余容量為 j - v[i] * k,之前 i - 1 種物品在該剩余容量下的最大價值為 f[i - 1][j - v[i] * k]// 放入 k 個第 i 種物品的價值為 w[i] * kf[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);// 輸出前 n 種物品,背包容量為 m 時能獲得的最大價值cout << f[n][m] << endl;return 0;
}

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

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

相關文章

【SUNO】【AI作詞】【提示詞】

仿寫歌詞提示詞模板&#xff08;升級版&#xff09; 一、仿寫目標 風格定位 音樂風格&#xff1a; [填寫目標風格&#xff0c;如&#xff1a;民謠/流行/古風/電子/爵士等]參考案例&#xff1a;如《成都》的敘事民謠&#xff0c;《孤勇者》的勵志流行。 情感基調&#xff1a; […

26考研——樹與二叉樹_樹與二叉樹的應用(5)

408答疑 文章目錄 三、樹與二叉樹的應用哈夫曼樹和哈夫曼編碼哈夫曼樹的定義概念帶權路徑長度&#xff08;WPL&#xff09;計算示例分析 哈夫曼樹的構造算法描述哈夫曼樹的性質示例 哈夫曼編碼Huffman樹的編碼規則Huffman樹的構建過程前綴編碼前綴編碼的分析及應用 Huffman樹的…

【VUE】day06 動態組件 插槽 自定義指令 ESlint

【VUE】day06 動態組件 & 插槽 & 自定義指令 1. 動態組件1.1 通過不同的按鈕展示不同的組件1.1.1回顧click 1.2 keep-alive的使用1.3 keep-alive對應的生命周期函數1.3.1 keep-alive的include屬性1.3.2 exclude 1.4 組件注冊名稱和組件聲明時name的區別1.4.1 組件聲明時…

nodejs-原型污染鏈

還是老規矩&#xff0c;邊寫邊學&#xff0c;先分享兩篇文章 深入理解 JavaScript Prototype 污染攻擊 | 離別歌 《JavaScript百煉成仙》 全書知識點整理-CSDN博客 Ctfshow web入門 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js審計 var express require(expr…

Oracle 數據庫通過exp/imp工具遷移指定數據表

項目需求&#xff1a;從prod數據庫遷移和復制2個表(BANK_STATE&#xff0c;HBS)的數據到uat數據庫環境。 數據庫版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 遷移工具&#xff1a;客戶端exp/imp工具 -- 執行命令 從Prod數據庫導出數據exp us…

企業級基于SpringBoot的MQTT的構建和使用

基于SpringBoot的MQTT配置及使用 首先要使用EMQX搭建一個MQTT服務器&#xff0c;參考文檔&#xff1a;EMQX快速開始 本著開源分享的觀點&#xff0c;閑話不多說&#xff0c;直接上代碼 導入Maven <dependency><groupId>org.springframework.integration</gro…

26考研——圖_圖的代碼實操(6)

408答疑 文章目錄 五、圖的代碼實操圖的存儲鄰接矩陣結構定義初始化插入頂點獲取頂點位置在頂點 v1 和 v2 之間插入邊獲取第一個鄰接頂點獲取下一個鄰接頂點顯示圖 鄰接表結構定義初始化圖插入頂點獲取頂點位置在頂點 v1 和 v2 之間插入邊獲取第一個鄰接頂點獲取下一個鄰接頂點…

開源webmail郵箱客戶端rainloop的分支版本SnappyMail 設置發件人允許多重身份

RainLoop已多年未更新&#xff0c;SnappyMail 是 RainLoop 的分支&#xff0c;由社區維護。SnappyMail 不僅修復了漏洞&#xff0c;還增加了更多功能和優化。對 IMAP 支持更好&#xff0c;移動端體驗也比 RainLoop 更細致。 安裝過程和設置跟RainLoop一樣&#xff1a; 以寶塔面…

海量數據場景題--查找兩個大文件的URL

查找兩個大文件共同的URL 給定 a、b 兩個文件&#xff0c;各存放 50 億個 URL&#xff0c;每個 URL 各占 64B&#xff0c;找出 a、b 兩個文件共同的 URL。內存限制是 4G。 操作邏輯&#xff1a; 使用哈希函數 hash(URL) % 1000? 將每個URL映射到0-999的編號 文件A切割為a0, a1…

簡單ELK框架搭建

簡介 ELK 框架是一套開源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三個主要組件組成&#xff0c;現在新增了Filebeat組件&#xff0c;可以更高效的收集數據。 Elasticsearch&#xff1a;是一個分布式、高可擴展的開源搜索引擎&#xff0c;能快速…

VS Code 中 .history`文件的來源與 .gitignore`的正確使用

引言 在使用 VS Code 進行 Git 版本控制時&#xff0c;有時會發現項目中多出一個 .history 目錄&#xff0c;并被 Git 識別為未跟蹤文件。本文將解釋 .history 的來源&#xff0c;并提供 .gitignore 的正確配置方法&#xff0c;確保開發環境的整潔性。 1. .history 文件的來源…

網絡之數據鏈路層

數據鏈路層 數據鏈路層目標 TCP/IP提供了一種能力, 將數據可靠的從 B 跨網絡送到 C 主機, 這期間是由無數次局域網轉發構成的, 比如 主機B 到 路由器F 就是一次局域網通信的問題, 而數據鏈路層就是研究數據是如何在局域網內部轉發的. 也就是說, 應用層是進行數據的處理, 傳輸…

A Brief History: from GPT-1 to GPT-3

This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …

基于大數據的各品牌手機銷量數據可視化分析系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;各品牌手機銷量數據可視化分析系統當然不能排除在外。基于大數據的各品牌手機銷量數據可視化分析系統是在實際應用和軟件工程的開發原理之…

人工智能-群暉Docker部署DB-GPT

人工智能-群暉Docker部署DB-GPT 0 環境及說明1 獲取dbgpt的docker鏡像2 下載向量模型3 下載配置文件4 修改配置文件5 創建dbgpt容器并運行6 訪問dbgpt0 環境及說明 環境項說明DSM版本DSM 7.2.1-69057 update 3Container Manager版本24.0.2-1535當前 hub.docker.com 鏡像倉庫中的…

Netty——TCP 粘包/拆包問題

文章目錄 1. 什么是 粘包/拆包 問題&#xff1f;2. 原因2.1 Nagle 算法2.2 滑動窗口2.3 MSS 限制2.4 粘包的原因2.5 拆包的原因 3. 解決方案3.1 固定長度消息3.2 分隔符標識3.3 長度前綴協議3.3.1 案例一3.3.2 案例二3.3.3 案例三 4. 總結 1. 什么是 粘包/拆包 問題&#xff1f…

JavaScript Fetch API

簡介 fetch() API 是用于發送 HTTP 請求的現代異步方法&#xff0c;它基于 Promise&#xff0c;比傳統的 XMLHttpRequest 更加簡潔、強大 示例 基本語法 fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > con…

UMI-OCR Docker 部署

額外補充 Docker 0.前置條件 部署前&#xff0c;請檢查主機的CPU是否具有AVX指令集 lscpu | grep avx 輸出如下即可繼續部署 Flags: ... avx ... avx2 ... 1.下載dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…

C++ --- 二叉搜索樹

1 二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹: 1 若它的左?樹不為空&#xff0c;則左?樹上所有結點的值都?于等于根結點的值 2 若它的右?樹不為空&#xff0c;則右?樹上所有結點的值都?于等于根結點…

跨語言語言模型預訓練

摘要 最近的研究表明&#xff0c;生成式預訓練在英語自然語言理解任務中表現出較高的效率。在本研究中&#xff0c;我們將這一方法擴展到多種語言&#xff0c;并展示跨語言預訓練的有效性。我們提出了兩種學習跨語言語言模型&#xff08;XLM&#xff09;的方法&#xff1a;一種…