揹包問題

問題 A: 揹包問題java

時間限制: 1 Sec  內存限制: 128 MB
提交: 517  解決: 259

[提交][狀態][討論版] 測試

題目描述spa

有個揹包可承受重量N,現有T類物品 
每類物品重量爲Wi,價值爲Vi ,每類物品的數量只有一個的, 
這個揹包能夠裝載物品的最大價值是多少?
內存

輸入it

一行,N T 之間用空格隔開 
後面t行,每行:重量Wi,價值Vi
table

輸出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,vCi]+Wi

這條式子是參考網友的,那麼要怎麼去理解呢?F[i,V]i件物品中選擇若干件放在容量爲v的揹包中,能夠取得的最大價值。

對於每個物品來分析,都有放入揹包,或者不放入揹包兩種狀況。當不放入揹包的時候,
F
[i,v]=F[i−1,v]表示前i件物品放入揹包的最大價值等於前i-1件物品放入揹包所能達到的最大價值,由於第i件並無放進去,因此揹包的價值並不會增長既F[i][v]的價值跟F[i-1][v]的價格是同樣的。

若選擇放,vCi確保有足夠的空間,隨之F[i,v]=F[i−1,vCi]+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 2018314下午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

相關文章
相關標籤/搜索