Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問題
概述
從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.
動(dòng)態(tài)規(guī)劃
動(dòng)態(tài)規(guī)劃 (Dynamic Programming) 的核心思想是把大問題劃分為小問題進(jìn)行解決. 先求解子問題, 然后從這些子問題的解得到原問題的解.
動(dòng)態(tài)規(guī)劃的優(yōu)點(diǎn):
- 可以幫助我們解決多階段問題, 化繁為簡(jiǎn)
動(dòng)態(tài)規(guī)劃的缺點(diǎn):
- 沒有統(tǒng)一的處理方法, 具體問題具體分析
- 當(dāng)變量的維數(shù)增大時(shí), 計(jì)算和存儲(chǔ)會(huì)急劇增大
背包問題
背包問題 (Knapsack Problem) 指有 N 件物品和一個(gè)容量為 V 的背包. 第 i 件物品的費(fèi)用是 c[i],價(jià)值是 w[i]. 求解將哪些物品裝入背包可使價(jià)值總和最大.
代碼實(shí)現(xiàn)
public class 背包問題 { public static void main(String[] args) { int[] w = {1, 2, 3}; // 物品重量 int[] val = {6, 10, 12}; // 物品價(jià)值 int m = 5; // 背包容量 int n = val.length; // // 創(chuàng)建二維數(shù)組 int[][] v = new int[n + 1][m + 1]; // 將第一行和第一列賦值為0 for (int i = 0; i < v.length; i++) { v[i][0] = 0; } for (int i = 0; i < v[0].length; i++) { v[0][i] = 0; } // 動(dòng)態(tài)處理 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 { // 裝入背包 v[i][j] = Math.max(v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]); } } } // 輸出二維數(shù)組 for (int i = 1; i < v.length; i++) { for (int j = 1; j < v[0].length; j++) { System.out.print(v[i][j] + "\t"); } System.out.println(); } } }
輸出結(jié)果:
6 6 6 6 6
6 10 16 16 16
6 10 16 18 22
到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之背包問題的文章就介紹到這了,更多相關(guān)Java 背包問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java統(tǒng)計(jì)字符串中字符出現(xiàn)次數(shù)的方法示例
這篇文章主要介紹了Java統(tǒng)計(jì)字符串中字符出現(xiàn)次數(shù)的方法,涉及Java針對(duì)字符串的遍歷、查找、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Java項(xiàng)目如何打包成Jar的實(shí)現(xiàn)步驟
一般情況下我們都是使用Java項(xiàng)目直接部署發(fā)布,有時(shí)需要我們將寫好的項(xiàng)目打成jar包,方便后期調(diào)用,本文主要介紹了Java項(xiàng)目如何打包成Jar,感興趣的可以了解一下2023-11-11詳解SpringMVC的攔截器鏈實(shí)現(xiàn)及攔截器鏈配置
攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下2022-08-08IO流概述分類字節(jié)流寫數(shù)據(jù)三種方式及問題分析
這篇文章主要為大家介紹了IO流概述分類字節(jié)流寫數(shù)據(jù)三種方式及寫數(shù)據(jù)問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12idea打開運(yùn)行配置java?web項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于idea打開運(yùn)行配置java?web項(xiàng)目的相關(guān)資料,有些時(shí)候我們用IDEA跑之前用eclipse中運(yùn)行的項(xiàng)目的時(shí)候,總是不止所措,要不就是只展示html,要不就是不能部署成功,需要的朋友可以參考下2023-08-08如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息
這篇文章主要介紹了如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類
本文主要介紹了IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Spring Cloud如何切換Ribbon負(fù)載均衡模式
這篇文章主要介紹了Spring Cloud如何切換Ribbon負(fù)載均衡模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12