問題 A: 揹包問題java
時間限制: 1 Sec 內存限制: 128 MB
提交: 517 解決: 259
[提交][狀態][討論版] 測試
題目描述spa
有個揹包可承受重量N,現有T類物品
每類物品重量爲Wi,價值爲Vi ,每類物品的數量只有一個的,
這個揹包能夠裝載物品的最大價值是多少?內存
輸入it
一行,N T 之間用空格隔開
後面t行,每行:重量Wi,價值Vitable
輸出class
這個揹包能夠裝載物品的最大價值 im
樣例輸入數據
100 5 static
77 92
22 22
29 87
50 46
99 90
樣例輸出
261
題目分析:這道題目能夠經過一條方程和一個表格來協助理解:F[i,v]=maxF[i−1,v],F[i−1,v−Ci]+Wi
這條式子是參考網友的,那麼要怎麼去理解呢?F[i,V]前i件物品中選擇若干件放在容量爲v的揹包中,能夠取得的最大價值。
對於每個物品來分析,都有放入揹包,或者不放入揹包兩種狀況。當不放入揹包的時候,
F[i,v]=F[i−1,v]表示前i件物品放入揹包的最大價值等於前i-1件物品放入揹包所能達到的最大價值,由於第i件並無放進去,因此揹包的價值並不會增長既F[i][v]的價值跟F[i-1][v]的價格是同樣的。
若選擇放,v−Ci確保有足夠的空間,隨之F[i,v]=F[i−1,v−Ci]+Wi。其中,F[i-1,v-Ci]表明當剛好能裝進第i件物品時的容量所對應的最佳價值。
下列是一組測試數據的表格形式:
static int[] C = { -1, 2, 2, 6, 5, 4 };//表明每件物品的重量,從第1位開始
static int[] W = { -1, 6, 3, 5, 4, 6 };//表明每件物品的價值,從第1位開始
name |
weight |
value |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
a |
2 |
6 |
0 |
0 |
6 |
6 |
9 |
9 |
12 |
12 |
15 |
15 |
15 |
b |
2 |
3 |
0 |
0 |
3 |
3 |
6 |
6 |
9 |
9 |
9 |
10 |
11 |
c |
6 |
5 |
0 |
0 |
0 |
0 |
6 |
6 |
6 |
6 |
6 |
10 |
11 |
d |
5 |
4 |
0 |
0 |
0 |
0 |
6 |
6 |
6 |
6 |
6 |
10 |
10 |
e |
4 |
6 |
0 |
0 |
0 |
0 |
6 |
6 |
6 |
6 |
6 |
6 |
6 |
代碼示例:
package com.eangaie.main.lanqiaobeiDP;
/** * * @CreateTime 2018年3月14日下午10:40:37 * * @author謝彥傑 * * @since JDK 1.8 * * 文件名稱:A.java * * 揹包問題 * **/
public class A {
static final int N = 5;// 物品個數 static final int V = 10;// 揹包體積 static int[] C = { -1, 2, 2, 6, 5, 4 }; static int[] W = { -1, 6, 3, 5, 4, 6 }; // 第 i 個物品的價值 static int[][] F = new int[N + 1][V + 1]; // 模擬一個(揹包容量,物品價值)的表格
public static void main(String[] args) { // TODO Auto-generated method stub int i, j; for (i = 1; i <= N; i++) { for (j = 0; j <= V; j++) { /* 分兩種狀況討論,放與不放 */ F[i][j] = F[i - 1][j];/* 不放時候的價值 */ /*若是放入這件物品以後的價值大於不放,則選擇放入物品*/ /*C[i] <= j (表明這個物品能裝進) && F[i][j] < F[i - 1][j - C[i]](表明裝上一件物品,已經揹包空間正好或者大於能裝下這件物品的空間時,這個揹包的價值) + W[i](加上這件物品的價值) * 判斷,如果價值更大,則保存這個結果*/ if (C[i] <= j && F[i][j] < F[i - 1][j - C[i]] + W[i]) { F[i][j] = F[i - 1][j - C[i]] + W[i]; }
} } System.out.println(F[N][V]); }
} |
運行結果:15