動態規劃之01背包問題

動態規劃算法
  • 動態規劃算法介紹
    • 動態規劃(Dynamic Programming)算法的核心思想是:將大問題劃分為小問題進行解決,從而一步步獲取最優解的處理算法
    • 動態規劃算法與分治法類似,其基本思想也是將待解決問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解
    • 與分治法不同的是,適合于動態規劃求解的問題。經分解得到子問題往往不是互相獨立的。(即下一個子階段的求解是建立在上一個子階段的基礎上,進行進一步的求解)
    • 動態規劃可以通過填表的方式來逐步推進,得到最優解
  • 應用場景-背包問題
    • 背包問題:有一個背包,容量為4磅,現有如下物品
      物品重量價格
      吉他(G)11500
      音響(S)43000
      電腦(L)32000
      • 要求達到的目標為裝入背包的總價值最大,并且重量不超出
      • 要求裝入的物品不能重復
    • 思路分析與圖解
      • 背包問題主要是指一個給定容量的背包、若干具有一定價值和重量的物品,如何選擇物品放入背包使物品的價值最大。其中又分為01背包完全背包(完全背包指的是:每種物品都有無限件可用)
      • 這里的問題屬于01背包,即每個物品最多放一個。而無線背包可以轉化為01背包
      • 算法的主要思想是,利用動態規劃來解決。每次遍歷到的第i個物品,根據w[i]和v[i]來確定是否需要將該物品放入背包中。即對于給定的n個物品,設v[i]、w[i]分別為第i個物品的價值和重量,C為背包的容量。再令v[i][j]表示再前i個物品中能夠裝入容量為j的背包中的最大價值。則我們得到如下結果
      1. v[i][0]=v[0][j]=0;//表示填入表第一行和第一列是0
      2. 當w[i]>j時:v[i][j]=v[i-1][j] // 當準備加入新增的商品容量大于當前背包的容量時,就直接使用上一個單元格的裝入策略
      3. 當j>=w[i]時,v[i][j]=max{v[i-1][j],v[i]+v[i-1][j-w[i]]}
      // 當準備加入的新增的商品的容量小于等于當前背包的容量
      // 裝入的方式
      v[i-1][j]:指上一個單元格裝入的最大值
      v[i]:當前商品的價值
      v[i-1][j-w[i]]:裝入i-1商品,到剩余空間j-w[i]的最大值
      
      • 圖解
        背包問題
    • 代碼實現
    public class KnapsackProblem {public static void main(String[] args) {int[] w = {1,4,3}; // 物品的重量int val[] = {1500,3000,2000}; // 物品的價值int m = 4; // 背包的容量int n = w.length; // 物品的個數// v[i][j]表示在前j個物品中能夠裝入容量為j的背包中的最大價值int[][] v = new int[n+1][m+1];// 記錄有沒有放入對應的商品.1表示放入了int[][] path = new int[n+1][m+1];// 初始化第一行和第一列,在本程序中可以不處理,因為默認是0// 根據前面得到公式來動態規劃處理// 跳過第一行和第一列for(int i = 1; i < v.length;i++) {for(int j = 1; j < v[0].length;j++) {// 當前物品大于背包容量if(w[i-1] > j) {v[i][j] = v[i-1][j];}else {// 當前物品大于等于背包容量int newValue = val[i - 1] + v[i - 1][j - w[i - 1]];if(v[i - 1][j] < newValue) {v[i][j] = newValue;// 表明把當前商品放入到背包中path[i][j] = 1;}else {v[i][j] = v[i - 1][j];}}}}// 輸出以下,看看目前的情況for (int i = 0; i < v.length; i++) {for (int j = 0; j < v[i].length; j++) {System.out.print(v[i][j] + "  ");}System.out.println();}System.out.println("------------------");// 輸出最后我們放入的是那些商品int i = path.length - 1; // 最后一個商品int j = path[0].length - 1;while(i > 0 && j > 0) {if(path[i][j] == 1) {System.out.println("把商品" + i + "放入背包中");j -= w[i-1];}i--;}}
    }
    

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

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

相關文章

人大金倉新建用戶,并且賦值查詢權限

-- 1. 創建用戶 visitor&#xff0c;并且設置密碼 CREATE USER visitor WITH PASSWORD 1234qwer; -- 2. 授予該用戶連接到數據庫 "yonbip_db" 的權限 GRANT CONNECT ON DATABASE yonbip_db TO visitor; -- 3. 假設你要讓 visitor 查詢的模式是 public&#xff08;或…

學習筆記丨信號處理新趨勢:量子計算將如何顛覆傳統DSP?

在算力需求爆炸式增長的今天&#xff0c;傳統數字信號處理&#xff08;DSP&#xff09;芯片正面臨物理極限的嚴峻挑戰。當經典計算機架構在摩爾定律的黃昏中掙扎時&#xff0c;量子計算正以顛覆性姿態崛起&#xff0c;準備重新定義信號處理的未來圖景。 目錄 傳統DSP的瓶頸&am…

react day.js使用及經典場景

簡介 Day.js 是一個輕量級的 JavaScript 日期庫&#xff0c;它提供了簡單易用的 API 來處理日期和時間。以及更加輕量級&#xff0c;并且具有更快的性能。 安裝 npm install dayjs 使用 import dayjs from "dayjs";dayjs().format("YYYY-MM-DD HH:mm:ss&qu…

【機器學習深度學習】線性回歸

目錄 一、定義 二、舉例說明 三、 數學形式 四、 訓練過程&#xff08;機器怎么學會這條線&#xff1f;&#xff09; 五、在 PyTorch 中怎么實現線性回歸&#xff1f; 六、如果你學懂了線性回歸&#xff0c;你也能理解這些 七、綜合應用&#xff1a;線性回歸示例 7.1 執…

如何在 Manjaro Linux 上安裝 .NET Core

.NET 是一個開源的開發框架平臺,可在所有流行的操作系統(如 Windows、Linux 和 macOS)上免費使用和安裝。它是跨平臺的,是主要由微軟員工在 .NET 基金會下開發的專有 .NET Framework 的繼承者。.NET 是一個統一的平臺,用于開發各種操作系統上的軟件,如 Web、移動、桌面應…

Mysql解惑(一)

使用 or 可能不走索引 使用 union替代 使用in&#xff0c;可能不走索引 如果優化&#xff1a; 臨時表強制索引exists代替

基于機器學習的側信道分析(MLSCA)Python實現(帶測試)

一、MLSCA原理介紹 基于機器學習的側信道分析(MLSCA)是一種結合傳統側信道分析技術與現代機器學習算法的密碼分析方法。該方法通過分析密碼設備運行時的物理泄漏信息(如功耗、電磁輻射等)&#xff0c;利用機器學習模型建立泄漏數據與密鑰信息之間的關聯模型&#xff0c;從而實…

【LLM】位置編碼

【LLM】位置編碼 1 絕對位置嵌入為什么用 1000 0 2 t d 10000^{\frac{2t}{d}} 10000d2t?? 2 相對位置嵌入2.1 Shaw等人的方法&#xff08;2018&#xff09;2.2 Dai等人的方法&#xff08;2019&#xff09;2.3 Raffel 等人的方法&#xff08;2020&#xff09;2.4 He 等人的方法…

Java 根據分組key構建合并數據集

文章目錄 前言背景總結 前言 請各大網友尊重本人原創知識分享&#xff0c;謹記本人博客&#xff1a;南國以南i、 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 背景 Java 需要返回一組數據供前端展示&#xff0c;獲取到的數據格式如下&#xff1a; …

Linux平臺Oracle開機自啟動設置

網上和官方文檔已經有不少介紹如何設置開機啟動Oracle實例的文章(Linux平臺)&#xff0c;不過以sysvinit和service這種方式居多。最近遇到了UAT環境的服務器打補丁后需要重啟服務器的情況&#xff0c; 需要DBA去手工啟動Oracle實例的情形&#xff0c;和同事討論&#xff0c;決定…

商品中心—商品B端搜索系統的實現文檔(二)

8.步驟四&#xff1a;基于索引實現搜索功能 (1)基于suggest索引的自動補全實現 實現自動補全的代碼比較簡單&#xff0c;其原理是&#xff1a;把搜索詞匯和倒排索引里的所有前綴匹配的詞條進行score比較&#xff0c;然后把分數最高的那些返回&#xff0c;其中會涉及到suggest索…

Codeforces Round 1027 (Div. 3)

A. Square Year 題目大意 給你一個四個字符的字符串&#xff0c;代表一個數字s 問是否存在a,b兩個數字&#xff0c;使得 ( a b ) 2 s (ab)^2s (ab)2s 思路 如果s是奇數或不能被開根號一定不行 設sq為s開根號后的結果 將sq一分為2&#xff0c;考慮sq/2有沒有余數的情況 //…

時序數據庫IoTDB的架構、安裝啟動方法與數據模式總結

一、IoTDB的架構 IoTDB的架構主要分為三個部分&#xff1a; ?時序文件&#xff08;Tsfile&#xff09;?&#xff1a; 專為時序數據設計的文件存儲格式。支持高效的壓縮和查詢性能。可獨立使用&#xff0c;并可通過TsFileSync工具同步至HDFS進行大數據處理。 ?數據庫引擎?…

ArrayList和LinkedList詳解

在Java后端開發中&#xff0c;集合框架是我們日常編程不可或缺的工具&#xff0c;它為數據存儲和操作提供了豐富的實現方式。作為Java集合框架中最常用的兩種List實現&#xff0c;ArrayList和LinkedList各自具有獨特的特性和適用場景。 1. 基本概念 1.1 ArrayList的定義與特性…

警惕微軟Entra ID風險:訪客賬戶存在隱蔽的權限提升策略

訪客用戶訂閱權限漏洞解析 微軟Entra ID的訂閱管理存在訪問控制缺陷&#xff0c;允許訪客用戶在受邀租戶中創建和轉移訂閱&#xff0c;同時保留對這些訂閱的完全所有權。訪客用戶只需具備在源租戶創建訂閱的權限&#xff0c;以及受邀成為外部租戶訪客的身份即可實施此操作。這…

EEG分類攻略2-Welch 周期圖

在EEG信號處理的上下文中&#xff0c;使用Welch方法來估算信號的功率譜密度&#xff08;Power Spectral Density, PSD&#xff09;是一種常見的做法。你的代碼片段是利用**scipy.signal.welch**函數來進行功率譜密度估算&#xff0c;并且涉及到一些關鍵的參數和步驟。讓我們逐步…

開疆智能CCLinkIE轉ModbusTCP網關連接脈沖計數器配置案例

本案例是三菱PLC通過CCLinkIE轉ModbusTCP網關連接脈沖計數器的配置案例&#xff0c;具體配置如下。 配置過程&#xff1a; 首先設置從站通訊參數 主要設置IP地址&#xff0c;工作模式以及端口號&#xff08;Modbus默認502&#xff09; 找到通訊點表&#xff0c;找到需要讀寫的…

gRPC 使用(python 版本)

.proto 文件 .proto 文件 是 gRPC 和 Protocol Buffers 的接口定義文件&#xff0c;它描述了&#xff1a; 要傳遞什么數據&#xff08;也就是消息體 message&#xff09;。要暴露什么接口&#xff08;也就是服務 service 和它們的 方法&#xff09;。 也就是一份規范文件&am…

VMware安裝

勾選【增強型鍵盤驅動程序】 #后期虛擬機用鼠標鍵盤比較好用 VMware創建主機Windows2 選擇類型配置【自定義】 安裝客戶機操作系統【稍后安裝操作系統】 客戶機操作系統【Microsoft Windows】,版本選Windows最高版本 【固件類型】默認UEFI 【處理器配置】選1個處理…

【沉浸式解決問題】微服務子模塊引入公共模塊的依賴后無法bean未注入

目錄 一、問題描述二、場景還原三、原因分析四、解決方案五、拓展知識參考文獻 一、問題描述 在微服務項目中的公共模塊進行了Mybatis Plus配置&#xff0c;創建了配置類并添加了Configuration注解&#xff0c;其他模塊引入該模塊后不生效 我這里是在Mybatis Plus公共模塊中注…