Java 數(shù)據(jù)結構與算法系列精講之背包問題
概述
從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結構 & 算法的新篇章.

動態(tài)規(guī)劃
動態(tài)規(guī)劃 (Dynamic Programming) 的核心思想是把大問題劃分為小問題進行解決. 先求解子問題, 然后從這些子問題的解得到原問題的解.

動態(tài)規(guī)劃的優(yōu)點:
- 可以幫助我們解決多階段問題, 化繁為簡
動態(tài)規(guī)劃的缺點:
- 沒有統(tǒng)一的處理方法, 具體問題具體分析
- 當變量的維數(shù)增大時, 計算和存儲會急劇增大
背包問題
背包問題 (Knapsack Problem) 指有 N 件物品和一個容量為 V 的背包. 第 i 件物品的費用是 c[i],價值是 w[i]. 求解將哪些物品裝入背包可使價值總和最大.

代碼實現(xiàn)
public class 背包問題 {
public static void main(String[] args) {
int[] w = {1, 2, 3}; // 物品重量
int[] val = {6, 10, 12}; // 物品價值
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;
}
// 動態(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();
}
}
}
輸出結果:
6 6 6 6 6
6 10 16 16 16
6 10 16 18 22
到此這篇關于Java 數(shù)據(jù)結構與算法系列精講之背包問題的文章就介紹到這了,更多相關Java 背包問題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用DateTimeFormatter格式化輸入的日期時間
這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時間,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
spring boot--從controller到DAO操作
這篇文章主要介紹了spring boot--從controller到DAO操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java?集合工具類Collections及Comparable和Comparator排序詳解
這篇文章主要介紹了java集合工具類Collections及Comparable和Comparator排序詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06

