0-1背包問題

ad9cf1b9938d4750829bcb8dc53e5d9c.png

二維版:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static int N = 1010;static int[][] dp = new int[N][N];  //dp[i][j] 只選前i件物品,體積 <= j的最優解static int[] w = new int[N];    //存儲價值static int[] v = new int[N];    //存儲體積static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args) throws IOException{String[] init = in.readLine().split(" ");int n = Integer.parseInt(init[0]);int Vmax = Integer.parseInt(init[1]);for(int i = 1;i <= n;i ++) {init = in.readLine().split(" ");v[i] = Integer.parseInt(init[0]);w[i] = Integer.parseInt(init[1]);}for(int i = 1;i <= n;i ++) {for(int j = 1;j <= Vmax;j ++) {if (v[i] > j) {     //當前背包裝不下.最優解就是上一層的數據dp[i][j] = dp[i - 1][j];} else {//裝得下的話,背包的價值會變成dp[i - 1][j - v[i]] + w[i]// j - v[i] 體積下的最優解 + w[i] 不一定會勝過dp[i - 1][j]dp[i][j] = Math.max(dp[i-1][j], dp[i - 1][j - v[i]] + w[i]);}}}System.out.print(dp[n][Vmax]);in.close();}
}

f[i][j]:只從前i個物品全,總體積<=j的最優解。局部最優=>全局最優

72293f298eb04c19bd7942e0313ab531.png

e41d401a4c5045b4b33e1fd9902f44ae.png

5f4d2867164c4fd8b9c37f4849e01955.png

a879dd06032d414c8eef5110fa1bd894.png

d2d86aa804a54262ab63fd293ce17c15.png

一維版

由模擬二維的過程可知,通過不斷覆蓋前一維的狀態,只一維數組也能實現

并且,并不是一維里的所有數據都需要更新,所以可以更新二維起始下標

二維更改一維需要滿足條件,在決策dp[i][j]時,要能夠知道dp[i - 1][j - v[i]]的狀態

要用的是一行的數據,不能用當前行的數據

263feaf30fbd4c3c920d8433206927e5.png

如表格中在決策第二件物品(v=2)時,dp[2]計算時,會把2更新成4,dp[4]計算時,需要用到上一次的2,而不是被更新過的4。所以決策時,每次都要用到前面的數據,但前面的數據又不能被改過。所以可以從后往前,可以確保你要決策的數,只被決策一次。

?

import java.io.*;
public class Main
{static int N = 1010;static int V;static int n;static int[] f = new int[N];   //只選前i件物品,背包容量為j的最優解static int[] v = new int[N];    //存體積static int[] w = new int[N];    //存價值static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));public static void main(String[] args)throws IOException{String[] init = in.readLine().split(" ");n = Integer.parseInt(init[0]);V = Integer.parseInt(init[1]);for(int i = 1;i <= n;i++){String[] data = in.readLine().split(" "); v[i] = Integer.parseInt(data[0]);w[i] = Integer.parseInt(data[1]);}for(int i = 1;i <= n;i++){  //從后往前決策, j < v[i] 的地方不需要更新,直接用上一次的數據for(int j = V;j >= v[i];j--){f[j] = Math.max(f[j],f[j-v[i]]+w[i]);}}System.out.println(f[V]);in.close();}
}

?

?

?

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

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

相關文章

Day03 嵌入式---中斷

目錄 一、簡單介紹 二、總體框架 三、NVIC 3.2 NVIC的寄存器 3.3 中斷向量表 3.4 中斷優先級 3.5 NVIC優先級分組 3.6 NVIC配置 3.6.1、設置中斷分組 3.6.2、初始化 四、EXTI 外部中斷 4.1.EXTI的基本概念 4.2.EXTI的?作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…

字符串函數`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模擬實現

文章目錄 &#x1f680;前言&#x1f680;庫函數strlen??strlen的模擬實現 &#x1f680;庫函數strcpy??strcpy的模擬實現 &#x1f680;strcmp??strcmp的模擬實現 &#x1f680;strstr??strstr的模擬實現 &#x1f680;strcat??strcat的模擬實現 &#x1f680;前言 …

ReactJS和VueJS的簡介以及它們之間的區別

本文主要介紹ReactJS和VueJS的簡介以及它們之間的區別。 目錄 ReactJS簡介ReactJS的優缺點ReactJS的應用場景VueJS簡介VueJS的優缺點VueJS的應用場景ReactJS和VueJS的區別 ReactJS簡介 ReactJS是一個由Facebook開發的基于JavaScript的前端框架。它是一個用于構建用戶界面的庫&…

【C語言】——函數遞歸,用遞歸簡化并實現復雜問題

文章目錄 前言一、什么是遞歸二、遞歸的限制條件三、遞歸舉例1.求n的階乘2. 舉例2&#xff1a;順序打印一個整數的每一位 四、遞歸的優劣總結 前言 不多廢話了&#xff0c;直接開始。 一、什么是遞歸 遞歸是學習C語言函數繞不開的?個話題&#xff0c;那什么是遞歸呢&#xf…

電商平臺商品銷量API接口,30天銷量API接口接口超詳細接入方案說明

電商平臺商品銷量API接口的作用主要是幫助開發者獲取電商平臺上的商品銷量信息。通過這個接口&#xff0c;開發者可以在自己的應用或網站中實時獲取商品的銷量數據&#xff0c;以便進行銷售分析、庫存管理、市場預測等操作。 具體來說&#xff0c;電商平臺商品銷量API接口的使…

RocketMq集成SpringBoot(待完善)

環境 jdk1.8, springboot2.7.3 Maven依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

vue3 筆記 - 聲明式 一

官網&#xff1a;Vue.js - 漸進式 JavaScript 框架 | Vue.js vue3編寫有聲明式和響應式。該文章僅記錄聲明式。vue3聲明式與vue2相同。 一、生命周期 創建之前 beforeCreate()已創建 created()掛載之前 beforeMount()已掛載 mounted()銷毀之前 beforeUnmount()已銷毀 unmoun…

java面試-Dubbo和zookeeper運行原理

遠離八股文&#xff0c;面試大白話&#xff0c;通俗且易懂 看完后試著用自己的話復述出來。有問題請指出&#xff0c;有需要幫助理解的或者遇到的真實面試題不知道怎么總結的也請評論中寫出來&#xff0c;大家一起解決。 java面試題匯總-目錄-持續更新中 分布式注冊中心和服務調…

Unity中后處理簡介

文章目錄 前言一、后處理的原理二、我們看一下Unity文檔中&#xff0c;內置的后處理前后的效果后處理前&#xff1a;后處理后&#xff1a; 前言 我們在這篇文章中&#xff0c;了解一下Unity中的后處理效果 后期處理概述 一、后處理的原理 在后處理的過程中&#xff0c;我們主…

Java當中常用的算法

文章目錄 算法二叉樹左右變換數據二分法實現 冒泡排序算法插入排序算法快速排序算法希爾排序算法歸并排序算法桶排序算法基數排序算法分治算法漢諾塔問題動態規劃算法引子代碼實現背包問題 KMP算法什么是KMP算法暴力匹配KMP算法實現 今天我們來看看常用的算法&#xff0c;開干。…

《微信小程序開發從入門到實戰》學習四十五

4.4 云函數 云函數是開發者提前定義好的、保存在云端并且將在云端運行的JS函數。 開發者先定義好云函數&#xff0c;再使用微信開發工具將云函數上傳到云空間&#xff0c;在云開發控制臺中可看到已經上傳的云函數。 云函數運行在云端Node.js環境中。 小程序端通過wx.cloud.…

IP地址定位技術為網絡安全建設提供全新方案

隨著互聯網的普及和數字化進程的加速&#xff0c;網絡安全問題日益引人關注。網絡攻擊、數據泄露、欺詐行為等安全威脅層出不窮&#xff0c;對個人隱私、企業機密和社會穩定構成嚴重威脅。在這樣的背景下&#xff0c;IP地址定位技術應運而生&#xff0c;為網絡安全建設提供了一…

Python Selenium 自動登入1688

Python Selenium是一個用于自動化Web瀏覽器操作的庫。它提供了一組功能強大的工具和API&#xff0c;可以模擬用戶在瀏覽器中的行為&#xff0c;并執行各種任務&#xff0c;如點擊、輸入文本、提交表單等。 要使用Python Selenium登錄1688網站&#xff0c;需要進行以下步驟&…

iOS微信小程序虛擬支付解決方案

眾所周知&#xff0c;在IOS微信小程序不支持虛擬支付&#xff0c;一直是困擾IOS開發者、運營最頭疼的問題&#xff0c;主要原因是蘋果不允許IOS微信上架這類產品。導致微信小程序的開發者在IOS上都不能支付虛擬商品&#xff0c;虛擬商品包含了虛擬課程、會員、虛擬書等。 那么…

短視頻ai剪輯分發矩陣系統源碼3年技術團隊開發搭建打磨

如果您需要搭建這樣的系統&#xff0c;建議您尋求專業的技術支持&#xff0c;以確保系統的穩定性和安全性。 在搭建短視頻AI剪輯分發矩陣系統時&#xff0c;您需要考慮以下幾個方面&#xff1a; 1. 技術實現&#xff1a;您需要選擇適合您的需求和預算的技術棧&#xff0c;例如使…

肖sir__ 項目講解__項目數據

項目時間&#xff1a; 情況一&#xff1a;項目時間開始到上線的時間&#xff0c;這個時間一般比較長&#xff08;一年&#xff0c;二年&#xff0c;三年&#xff09; 情況二&#xff1a;項目的版本的時間或則是周期&#xff08;1個月&#xff0c;2個月&#xff0c;3個月&…

機器人、智能小車常用的TT電機/310電機/370電機選型對比

在制作智能小車或小型玩具時&#xff0c;在電機選型上一些到各種模糊混淆的概念&#xff0c;以及各種錯綜復雜的電機參數&#xff0c;本文綜合對比幾種常用電機的參數及特性適應范圍&#xff0c;以便快速選型&#xff0c;注意不同生產廠家的電機參數規則會有較大差異。 普通TT…

論文閱讀:PointCLIP: Point Cloud Understanding by CLIP

CVPR2022 鏈接&#xff1a;https://arxiv.org/pdf/2112.02413.pdf 0、Abstract 最近&#xff0c;通過對比視覺語言預訓練(CLIP)的零鏡頭學習和少鏡頭學習在2D視覺識別方面表現出了鼓舞人心的表現&#xff0c;即學習在開放詞匯設置下將圖像與相應的文本匹配。然而&#xff0c;…

【ET8】2.ET8入門-ET框架解析

菜單欄相關&#xff1a;ENABLE_DLL選項 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在開發階段使用Editor時需要關閉ENABLE_DLL選項。該選項關閉時&#xff0c;修改腳本之后&#xff0c;會直接重新編譯所有的代碼&#xff0c;Editor在運行時會直接使用最…

免費網頁抓取工具大全【附下載和工具使用教程】

在當今信息爆炸的時代&#xff0c;獲取準確而豐富的數據對于企業決策和個人研究至關重要。而網頁抓取工具作為一種高效獲取互聯網數據的方式&#xff0c;正逐漸成為大家解決數據需求的得力助手。本文將深入探討網頁抓取工具的種類&#xff0c;并為大家提供簡單實用的頁面采集教…