「動態規劃::背包」01背包 / AcWing 2(C++)

概述

AcWing 2:

有?N?件物品和一個容量是?V?的背包。每件物品只能使用一次。

第?i?件物品的體積是?v[i],價值是?w[i]。

求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大。
輸出最大價值。

輸入格式

第一行兩個整數,N,V,用空格隔開,分別表示物品數量和背包容積。

接下來有?N?行,每行兩個整數用空格隔開,分別表示第?i 件物品的體積和價值。

輸出格式

輸出一個整數,表示最大價值。

數據范圍

0<N,V≤10000<N,V≤1000
0<vi,wi≤10000<vi,wi≤1000

輸入樣例
4 5
1 2
2 4
3 4
4 5
輸出樣例:
8

背包DP是非常經典的動態規劃問題,而01背包更是典中典問題。

之所以稱為01背包,是因為每個物品只有選與不選兩種狀態。


思路

dp就不得不由狀態定義和子問題分解,我們來思索一下。

?定義dp[a][b]為能夠物品選擇范圍為[0, a]且當前背包最多能裝體積為b的物品總量時的最優解。

這樣,我們就可以從小問題推導出大問題的解,應該是這樣的:

考慮選擇范圍為前i個物品,體積為j,有選與不選兩種狀態,取兩種情況最大值。

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

如果 j?< v[i],則代表放不下這個物品,dp[i][j] = dp[i - 1][j];


解題過程

我們可以得到非常直觀的二重循環。

int solve(){for (int i = 1; i <= n; i++)for (int j = 0; j <= m; j++) {if (j < v[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i]);}return dp[n][m];
}

優化方案

背包dp有著非常知名的空間優化。

觀察狀態轉移,可以發現:空間可以被優化成1維的。

我們不再用i存儲當前的可選范圍信息,取而代之的是,這個信息隱式地蘊含在每次循環中。?

int solve(){for (int i = 1; i <= n; i++)for (int j = m; j >= v[i]; j--) {dp[j] = max(dp[j], dp[j - v[i]] + w[i]);}return dp[m];
}

這里有一個非常重要的行為:倒序枚舉j。

我們要保證dp來自于上一個i,即不能污染狀態轉移的數據源,考慮到 j 來自j - v[i],我們倒序枚舉j,就使得j - v[i]不會被j污染。

形象的說

狀態轉移的方向是從前向后->,如果更新順序是從后向前<-,那么每個狀態獲得的新值都不來自這次更新,而是上次。

這樣一來,我們可以保證在計算當前(i)dp[j]時,使用的是上次(i - 1)dp[j],這樣就等效于二維數組了。

Code

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1005;
int v[N], w[N];
int dp[N];
int n,m;
int solve(){for (int i = 1; i <= n; i++)for (int j = m; j >= v[i]; j--) {dp[j] = max(dp[j], dp[j - v[i]] + w[i]);}return dp[m];
}
int main(){cin >> n >> m;for (int i = 1; i <= n; i++)cin >> v[i] >> w[i];cout << solve();return 0;
}

復雜度

時間復雜度:?O(nm)?//需求解n*m個狀態。

空間復雜度:?O(n) ???//預留dp數組空間

總結

背包問題是非常經典的動態規劃問題,后續將講解完全背包、分組背包等更進一步的問題。

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

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

相關文章

Java 中的 設計模式詳解

一&#xff1a;設計模式概述 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;分類 創建型 行為型 結構型 二&#xff1a;軟件設計模式 2.1 開閉原則 &#xff08;1&#xff09;定義 在程序需要進行拓展的時候&#xff0c;不能修改原有代碼 使用到接口和抽象類&#x…

阿里qiankun微服務搭建

主服務 chat vue3 ts vite 子服務 ppt react 18 vite 子服務 agent 主服務 npm i vite-plugin-qiankun mian.ts import ./style/base.scss import virtual:svg-icons-register import { createApp } from vue import { createPinia } from piniaimport App from ./App.vue im…

安裝WSL2,配置Ubuntu圖像化界面

目錄 一、前言二、安裝WSL三、安裝圖像化界面四、參考 一、前言 Windows 子系統下的 Linux 子系統&#xff08;WSL&#xff0c;Windows Subsystem for Linux&#xff09;是微軟推出的一項功能&#xff0c;允許用戶在 Windows 系統中原生運行 Linux 環境&#xff0c;無需安裝虛…

圖像畸變-徑向切向畸變實時圖像RTSP推流

實驗環境 注意&#xff1a;ffmpeg進程stdin寫入兩張圖片的時間間隔不能太長&#xff0c;否則mediamtx會出現對應的推流session超時退出。 實驗效果 全部代碼 my_util.py #進度條 import os import sys import time import shutil import logging import time from datetime i…

Redis Sentinel 和 Redis Cluster 各自的原理、優缺點及適用場景是什么?

我們來詳細分析下 Redis Sentinel (哨兵) 和 Redis Cluster (集群) 這兩種方案的原理和使用場景。 Redis Sentinel (哨兵) 原理: Sentinel 本身是一個或一組獨立于 Redis 數據節點的進程。它的核心職責是監控一個 Redis 主從復制 (Master-Slave) 架構。多個 Sentinel 進程協同…

基于機器學習的電影票房預測

目錄 摘 要(完整下載鏈接附在文末) Abstract 1 緒 論 1.1 研究背景概述 1.2 國內外相關領域研究進展 1.3 電影票房預測技術概覽 1.3.1 利用人口統計學特征的方法 1.3.2 基于機器學習的預測模型 2 機器學習相關理論介紹與分析 2.1 機器學習算法理論 2.1.1卷積…

SVMSPro平臺獲取HTTP-FLV規則

SVMSPro平臺獲取HTTP-FLV規則 HTTP-FLV的服務端口為&#xff1a;53372&#xff0c;如需要公網訪問需要開啟這個端口 這里講的是如何獲取長效URL&#xff0c;短效&#xff08;時效性&#xff09;URL也支持&#xff0c;下回講 一、如何獲取HTTP-FLV實時流視頻 http://host:po…

ARM架構的微控制器總線矩陣

在 ARM 架構的微控制器&#xff08;MCU&#xff09;中&#xff0c;總線矩陣&#xff08;Bus Matrix&#xff09; 是總線系統的核心互連結構&#xff0c;負責協調多個主設備&#xff08;如 CPU、DMA、以太網控制器等&#xff09;對多個從設備&#xff08;如 Flash、SRAM、外設等…

AI賦能金融:智能投顧、風控與反欺詐的未來

AI賦能金融&#xff1a;智能投顧、風控與反欺詐的未來 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 AI賦能金融&#xff1a;智能投顧、風控與反欺詐的未來摘要引言一、智能投顧&#xff1a;從經驗驅動到人機協同…

【機器學習】樸素貝葉斯

目錄 一、樸素貝葉斯的算法原理 1.1 定義 1.2 貝葉斯定理 1.3 條件獨立性假設 二、樸素貝葉斯算法的幾種常見類型 2.1 高斯樸素貝葉斯 (Gaussian Naive Bayes) 【訓練階段】 - 從數據中學習模型參數 【預測階段】 - 對新樣本 Xnew? 進行分類 2. 2 多項式樸素貝葉斯 (…

鴻蒙 ArkTS 組件 通用事件 通用屬性 速查表

ArkTS 組件 組件 通用事件 速查表 通用事件事件名稱簡要說明點擊事件onClick(event: Callback<ClickEvent>, distanceThreshold: number): T相較于原有 onClick 接口&#xff0c;新增 distanceThreshold 參數作為點擊事件移動閾值&#xff0c;當手指的移動距離超出所設…

Java云原生+quarkus

一、Java如何實現云原生應用&#xff1f; 傳統的 Java 框架&#xff08;如 Spring Boot&#xff09;雖然功能強大&#xff0c;但在云原生場景下可能顯得笨重。以下是一些更適合云原生的輕量級框架&#xff1a; Quarkus(推薦) 專為云原生和 Kubernetes 設計的 Java 框架。支持…

C語言教程(二十三):C 語言強制類型轉換詳解

一、強制類型轉換的概念 強制類型轉換是指在程序中手動將一個數據類型的值轉換為另一種數據類型。在某些情況下,編譯器可能不會自動進行類型轉換,或者自動轉換的結果不符合我們的預期,這時就需要使用強制類型轉換來明確指定要進行的類型轉換。 二、強制類型轉換的語法 強制類…

Spring Boot × K8s 監控實戰-集成 Prometheus 與 Grafana

在微服務架構中&#xff0c;應用的可觀測性至關重要。Kubernetes 已成為容器化部署的標準&#xff0c;但其自身的監控能力有限&#xff0c;需要與其他工具集成才能實現詳細的運行數據采集與分析。 本文將通過 Spring Boot Kubernetes Prometheus Grafana 實戰&#xff0c;打…

phpstudy修改Apache端口號

1. 修改Listen.conf文件 本地phpstudy安裝目錄&#xff1a; 2.其他問題 ① 修改httpd.conf不起作用 ② 直接通過控制面板配置好像有延遲緩存

(done) 吳恩達版提示詞工程 6. 轉換 (翻譯,通用翻譯,語氣風格變換,文本格式轉換,拼寫檢查和語法檢查)

視頻&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 別人的筆記&#xff1a;https://zhuanlan.zhihu.com/p/626966526 6. 轉換任務&#xff08;Transforming&#xff0…

什么是靜態住宅ip,跨境電商為什么要用靜態住宅ip

在數字時代&#xff0c;IP地址不僅是設備聯網的“ID”&#xff0c;更是跨境電商運營中的關鍵工具。尤其對于需要長期穩定、安全操作的場景&#xff0c;靜態住宅IP逐漸成為行業首選。 一、什么是靜態住宅IP&#xff1f; 靜態住宅IP&#xff08;Static Residential IP&#xff0…

Qemu-STM32(十七):STM32F103加入AFIO控制器

概述 本文主要描述了在Qemu平臺中&#xff0c;如何添加STM32F103的AFIO控制器模擬代碼&#xff0c;AFIO是屬于GPIO引腳復用配置的功能。 參考資料 STM32F1XX TRM手冊&#xff0c;手冊編號&#xff1a;RM0008 添加步驟 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…

QuecPython+audio:實現音頻的錄制與播放

概述 QuecPython 作為專為物聯網設計的開發框架&#xff0c;通過高度封裝的 Python 接口為嵌入式設備提供了完整的音頻處理能力。本文主要介紹如何利用 QuecPython 快速實現音頻功能的開發。 核心優勢 極簡開發&#xff1a;3行代碼完成基礎音頻錄制與播放。快速上手&#xf…

企業架構之旅(3):TOGAF ADM架構愿景的核心價值

一、引言&#xff1a;為什么架構愿景是企業架構的「導航圖」 在企業數字化轉型的浪潮中&#xff0c;TOGAF ADM&#xff08;架構開發方法&#xff09;作為公認的企業架構「方法論圣經」&#xff0c;其首個關鍵階段 —— 架構愿景&#xff08;Architecture Vision&#xff09;&a…