【背包dp----01背包】例題三------(標準的01背包+變種01背包1【恰好裝滿背包體積 產生的 最大價值】)

【模板】01背包 題目鏈接

題目描述 :

在這里插入圖片描述

輸入描述:

在這里插入圖片描述

輸出描述:

在這里插入圖片描述

示例1

輸入

3 5
2 10
4 5
1 4

輸出

14
9

說明

裝第一個和第三個物品時總價值最大,但是裝第二個和第三個物品可以使得背包恰好裝滿且總價值最大。

示例2

輸入

3 8
12 6
11 8
6 8

輸出

8
0

說明

裝第三個物品時總價值最大但是不滿,裝滿背包無解。

備注:

要求O(nV)的時間復雜度,O(V)空間復雜度

題目描述

給定 n 個物品,每個物品有體積 v[i] 和價值 m[i]。一個容量為 vs 的背包。

你可以選擇一些物品放入背包中,使得總體積 不超過或恰好等于 背包容量,目標是使總價值最大。

一、 DP 狀態定義

dp[i][j] 表示前 i 個物品中選擇若干物品,裝入容量為 j 的背包中可以獲得的最大價值。

這個狀態定義允許容量 j 不超過 當前背包容量,不要求填滿。


二、狀態轉移方程

對于每個物品 i 和容量 j

  • 如果當前物品可以放進容量 j 的背包中(即 j >= v[i]),那么有兩種選擇:
    • 不選這個物品:dp[i][j] = dp[i-1][j]
    • 選這個物品:dp[i][j] = max(dp[i][j], dp[i-1][j - v[i]] + m[i])

否則:

  • 只能不選:dp[i][j] = dp[i-1][j]

三、初始化方式

vector<vector<ll>> dp(n+1, vector<ll>(vs+1, INT_MIN));
dp[0][0] = 0;
  • 初始狀態只有 dp[0][0] = 0,表示沒有物品、容量為 0 時合法;
  • 其他所有狀態初始化為 INT_MIN(極小值),表示不可達;
  • 這樣在后續轉移過程中,只保留有效路徑的狀態。

四、輸出策略

? 不要求填滿的情況下的最大價值(ender1):

ll ender1 = INT_MIN;
for (ll i = vs; i >= 1; i--) {ender1 = max(ender1, dp[n][i]);
}
ender1 = (ender1 < 0) ? 0 : ender1;
  • 遍歷 dp[n][1...vs],找出最大值;
  • 如果所有值都為負數,則說明沒有任何合法組合,返回 0。

? 必須恰好填滿容量 vs 的情況(ender2):

ll ender2 = (dp[n][vs] < 0) ? 0 : dp[n][vs];
  • 直接取 dp[n][vs]
  • 如果它是負數,說明無法恰好填滿容量 vs,返回 0。

五、易錯點總結

易錯點原因解決方法
? 忽略 j=0 的遍歷容量 j=0 是合法狀態,必須包含在內內層循環從 j=0 開始
? 初始化錯誤若將 dp 初始化為 0,會導致無法區分是否可達使用 INT_MIN 表示不可達
? 忘記處理負值若最終結果為負,說明無合法組合加上 (val < 0) ? 0 : val 處理
? 不理解 ender1ender2 區別一個是“任意容量下”的最大值,一個是“特定容量”下的最大值分開處理即可

六、完整代碼

#include<bits/stdc++.h>
using ll = long long;
using namespace std;int main()
{ll n, vs;cin >> n >> vs;vector<ll> m(n + 1, 0);vector<ll> v(n + 1, 0);for (ll i = 1; i <= n; ++i)cin >> v[i] >> m[i];// 初始化 dp 數組vector<vector<ll>> dp(n + 1, vector<ll>(vs + 1, INT_MIN));dp[0][0] = 0;for (ll i = 1; i <= n; i++) {for (ll j = 0; j <= vs; j++) {if (j >= v[i])dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + m[i]);elsedp[i][j] = dp[i - 1][j];}}// 不要求填滿的最大價值ll ender1 = INT_MIN;for (ll i = vs; i >= 1; i--){ender1 = max(ender1, dp[n][i]);}ender1 = (ender1 < 0) ? 0 : ender1;// 恰好填滿的最大價值ll ender2 = (dp[n][vs] < 0) ? 0 : dp[n][vs];cout << ender1 << endl << ender2;return 0;
}

想從(1,1)開始轉移的話

必須顯式初始化dp[n][0]=0;
代碼如下:

#include<bits/stdc++.h>
using ll = long long;
using namespace std;int main()
{ll n, vs;cin >> n >> vs;vector<ll>m(n + 1, 0);vector<ll>v(n + 1, 0);for (ll i = 1; i <= n; i++){cin >> v[i] >> m[i];}//原問題:這個背包至多能裝多大價值的物品//抽象成 前n個物品(經過選擇)裝滿體積為vs的背包 能獲得的最大價值//dp[i][j]表示 前i個物品(經過選擇)裝滿體積為vs的背包,能獲得的最大價值//狀態轉移方程:(每個位置的元素都有選 或 不選 兩種狀態)//dp[i][j]=max(dp[i-1][j](不選), dp[i-1][j-v[i]]+m[i])(選)//注意體積問題:體積j>=v[i]時,才能選擇當前物品vector<vector<ll>>dp(n + 1, vector<ll>(vs + 1, INT_MIN));//顯式初始化 前n件物品 (經過選擇) 裝滿體積為0的背包,能獲得的最大價值為0for (ll i = 0; i <= n; i++){dp[i][0] = 0;}for (ll i = 1; i <= n; i++){for (ll j = 1; j <= vs; j++){if (j >= v[i]){dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + m[i]);}else{dp[i][j] = dp[i - 1][j];}}}//最大價值應該是最后一行:前n個物品 放滿 體積為j的最大價值(找最大的)//dp[n][vs]應該是填滿體積為vs時 創造的最大價值ll ender1 = INT_MIN;for (ll i = vs; i >= 1; i--){ender1 = max(ender1, dp[n][i]);}ender1 = (ender1 < 0) ? 0 : ender1;ll ender2 = (dp[n][vs] < 0) ? 0 : dp[n][vs];//cout<<dp[n][vs]<<endl;cout << ender1 << endl << ender2;return 0;
}

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

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

相關文章

Node.js 的 child_process 模塊詳解

Node.js 的 child_process 模塊提供了創建子進程的能力,使 Node.js 應用能夠執行系統命令、運行其他程序或腳本。這個模塊非常強大,可以幫助我們實現很多復雜的功能。 1. exec - 執行 shell 命令 exec 方法用于執行 shell 命令,并緩沖任何產生的輸出。 特點 創建 shell 來…

進程與線程詳細介紹

目錄 一 進程概念 二 進程的組成 2.1 PCB 2.2 數據段 2.3 程序段 三 進程的五大特點 四 進程的創建與銷毀 五 線程概念 六 線程特征 七 進程與線程的區別與聯系 區別 聯系 一 進程概念 進程是程序的一次執行過程&#xff0c;是操作系統進行資源分配和調度的基本單位…

如何在服務器后臺運行Python腳本,并配置虛擬環境與GPU支持

使用Conda虛擬環境在服務器后臺運行Python腳本&#xff0c;并檢查GPU分配 在服務器開發環境中&#xff0c;我們需要確保Python腳本運行在指定的Conda虛擬環境中&#xff0c;并且確認是否正確分配了GPU資源。本文將通過一個完整的start.sh腳本&#xff0c;完成以下功能&#xff…

前端取經路——工程化渡劫:八戒的構建之道

大家好,我是老十三,一名前端開發工程師。前端工程化就像八戒的釘耙,看似簡單卻能降妖除魔。在本文中,我將帶你探索前端工程化的九大難題,從模塊化組織到CI/CD流程,從代碼規范到自動化測試,揭示這些工具背后的核心原理。無論你是初學者還是資深工程師,這些構建之道都能幫…

Ubuntu 安裝 Keepalived

Keepalived 是什么 Keepalived 是一個用于實現高可用性&#xff08;High Availability, HA&#xff09;的服務&#xff0c;是一款基于 VRRP 協議的高可用軟件&#xff0c;常用于主備切換和虛擬IP漂移&#xff0c;在服務故障時自動實現故障轉移。 Keepalived 的核心功能 功能說…

DHCP理解

文章目錄 DHCP理解DHCP的核心作用DHCP默認端口DHCP的工作原理&#xff08;4個步驟&#xff09;圖示說明&#xff08;含中繼代理&#xff09;DHCP Discover&#xff08;客戶端發現階段&#xff09;DHCP Offer&#xff08;服務器提供階段&#xff09;DHCP Request&#xff08;客戶…

云計算-容器云-部署CICD-jenkins連接gitlab

安裝 Jenkins 將Jenkins部署到default命名空間下。要求完成離線插件的安裝,設置Jenkins的登錄信息和授權策略。 上傳BlueOcean.tar.gz包 [root@k8s-master-node1 ~]#tar -zxvf BlueOcean.tar.gz [root@k8s-master-node1 ~]#cd BlueOcean/images/ vim /etc/docker/daemon.json…

AI 大模型新浪潮:從 DeepSeek-Prover 到 Qwen3,再到 DeepSeek-R2,邁向自動推理的新時代20250507

&#x1f9e0; AI 大模型新浪潮&#xff1a;從 DeepSeek-Prover 到 Qwen3&#xff0c;再到 DeepSeek-R2&#xff0c;邁向自動推理的新時代 &#x1f680; 引言&#xff1a;大模型&#xff0c;不止是語言處理器&#xff0c;而是思維建構者 在 2025 年春天&#xff0c;我們見證了…

觀察者模式(Observer Pattern)詳解

文章目錄 1. 什么是觀察者模式?2. 為什么需要觀察者模式?3. 觀察者模式的核心概念4. 觀察者模式的結構5. 觀察者模式的基本實現簡單的氣象站示例6. 觀察者模式的進階實現推模型 vs 拉模型6.1 推模型(Push Model)6.2 拉模型(Pull Model)7. 觀察者模式的復雜實現7.1 在線商…

前端代碼規范詳細配置

以下是現代前端項目的完整代碼規范配置方案&#xff0c;涵蓋主流技術棧和自動化工具鏈配置&#xff1a; 一、基礎工程配置 1. 項目結構規范 project/ ├── src/ │ ├── assets/ # 靜態資源 │ ├── components/ # 通用組件 │ ├── layouts/ …

Missashe考研日記-day34

Missashe考研日記-day34 1 專業課408 學習時間&#xff1a;3h學習內容&#xff1a; 今天是學習I/O管理第二小節的內容&#xff0c;聽了課也做了題&#xff0c;這是操作系統倒數第二節知識了&#xff0c;還差最后一節就完結了。知識點回顧&#xff1a; 1.I/O核心子系統&#x…

Milvus 向量數據庫詳解與實踐指南

一、Milvus 核心介紹 1. 什么是 Milvus&#xff1f; Milvus 是一款開源、高性能、可擴展的向量數據庫&#xff0c;專門為海量向量數據的存儲、索引和檢索而設計。它支持近似最近鄰搜索&#xff08;ANN&#xff09;&#xff0c;適用于圖像檢索、自然語言處理&#xff08;NLP&am…

算力經濟模型研究:從云計算定價到去中心化算力市場設計

引言&#xff1a;算力商品化的雙重革命 在H800 GPU集群的算力供給能力突破2.3 EFLOPS的今天&#xff0c;算力定價機制正經歷從"資源租賃"到"動態市場"的范式轉變。傳統云計算定價模型&#xff08;如AWS按需實例&#xff09;的靜態價格機制已難以適應大模型…

[D1,2] 貪心刷題

文章目錄 擺動序列最大子數組合買賣股票跳躍游戲跳躍2 擺動序列 不像是貪心&#xff0c;只要抓住擺動這個點&#xff0c;前一個上升&#xff0c;那下一個就要下降&#xff0c;記錄上一次的狀態為1的話&#xff0c;那下一次就要更新為-1&#xff0c;如果上一次為1&#xff0c;這…

Spring Boot操作MongoDB的完整示例大全

以下是基于Spring Boot操作MongoDB的完整示例大全&#xff0c;涵蓋增刪改查、聚合查詢、索引、事務等核心功能&#xff1a; 一、基礎CRUD操作 1. 環境配置 依賴配置&#xff08;pom.xml&#xff09; <dependency><groupId>org.springframework.boot</groupId…

【實戰教程】零基礎搭建DeepSeek大模型聊天系統 - Spring Boot+React完整開發指南

&#x1f525; 本文詳細講解如何從零搭建一個完整的DeepSeek AI對話系統&#xff0c;包括Spring Boot后端和React前端&#xff0c;適合AI開發入門者快速上手。即使你是編程萌新&#xff0c;也能輕松搭建自己的AI助手&#xff01; &#x1f4da;博主匠心之作&#xff0c;強推專欄…

Linux系統基本指令和知識指南

一、Linux系統簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由林納斯托瓦茲在1991年首次發布。它以穩定性、安全性和靈活性著稱&#xff0c;廣泛應用于服務器、嵌入式系統和個人計算機。 Linux主要特點&#xff1a; 開源免費 多用戶、多任務 良好的安全性…

【計算機視覺】OpenCV實戰項目:Long-Exposure:基于深度學習的長時間曝光合成技術

Long-Exposure&#xff1a;基于深度學習的長時間曝光合成技術 項目概述與技術背景項目核心功能技術原理 環境配置與安裝硬件要求建議詳細安裝步驟可選組件安裝 實戰應用指南1. 基礎使用&#xff1a;視頻轉長曝光2. 高級模式&#xff1a;自定義光軌合成3. 批量處理模式 技術實現…

TikTok 矩陣賬號運營實操細節:打造爆款矩陣

在 TikTok 的流量版圖里&#xff0c;打造 TikTok 矩陣賬號能顯著提升影響力與吸粉能力。而借助 AI 工具&#xff0c;更可為 TikTok 矩陣運營效率的提升賦能&#xff0c;讓運營如虎添翼。下面就為大家詳細講講其中的實操細節&#xff0c;并結合一些偽代碼示例輔助理解。 一、矩…

互聯網大廠Java求職面試:分布式系統中向量數據庫與AI應用的融合探索

互聯網大廠Java求職面試&#xff1a;分布式系統中向量數據庫與AI應用的融合探索 面試開場&#xff1a;技術總監與鄭薪苦的“較量” 技術總監&#xff08;以下簡稱T&#xff09;&#xff1a;鄭薪苦先生&#xff0c;請簡單介紹一下你在分布式系統設計方面的經驗。 鄭薪苦&…