溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現背包動態規劃

發布時間:2022-02-21 16:40:12 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

本篇內容主要講解“Java怎么實現背包動態規劃”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java怎么實現背包動態規劃”吧!

背包問題

【題目描述】
一個旅行者有一個最多能裝 MM 公斤的背包,現在有 nn 件物品,它們的重量分別是W1,W2,…,WnW1,W2,…,Wn,它們的價值分別為C1,C2,…,CnC1,C2,…,Cn,求旅行者能獲得最大總價值。

【輸入】
第一行:兩個整數,MM(背包容量,M<=200M<=200)和NN(物品數量,N<=30N<=30);

第2…N+12…N+1行:每行二個整數Wi,CiWi,Ci,表示每個物品的重量和價值。

【輸出】
僅一行,一個數,表示最大總價值。

【輸入樣例】
10 4
2 1
3 3
4 5
7 9
【輸出樣例】
12

我們可以通過自己打表的方式找變化求得狀態方程
(橫向表示容量,j)(縱向表示第幾個,i)
#1 2 3 4 5 6 7 8 9 10
1 0 1 1 1 1 1 1 1 1 1
2 0 1 3 3 4 4 4 4 4 4
3 0 1 3 5 5 6 8 8 9 9
4 0 1 3 5 5 6 9 9 10 12

dp[i][j]----i表示物品個數,j表示容量,dp[i][j]的值表示在此狀態的最大價值
由此我們可以寫出狀態轉移方程:

if(j<w[i])//當容量小于重量,即不拿的情況下
	dp[i][j]=dp[i-1][j]//等于上一次的值
else
	 dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);

完整代碼如下:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m, n;
        int[] w = new int[35];
        int[] v = new int[35];
        m = in.nextInt();
        n = in.nextInt();
        int[][] dp = new int[35][205];//m容量,n數目個數

        for (int i = 1; i <= n; i++) {
            w[i] = in.nextInt();
            v[i] = in.nextInt();
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if(j<w[i])
                {
                    dp[i][j]=dp[i-1][j];
                }else
                {
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                }
            }
        }
        //輸出dp數組
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println(dp[n][m]);
        in.close();
    }
}

當然,如果容量數字和物品個數很大的時候,這個表會很大,但是dp數組只與自己的上一次有關,會造成空間浪費,所以我們可以改進成滾動數組,減小空間,使其變成一維數組。

小tips:因為是滾動數組,所以如果第二層循環從1開始的話,可能會覆蓋上一次的值,所以第二層循環的時候我們從后往前開始!

import java.util.*;
import java.lang.*;

public class Main {
    static int[]dp=new int[205];
    static int[] w = new int[35];
    static int[] v = new int[35];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m, n;
        m = in.nextInt();
        n = in.nextInt();
//        int[][] dp = new int[35][205];//m容量,n數目個數


        for (int i = 1; i <= n; i++) {
            w[i] = in.nextInt();
            v[i] = in.nextInt();
        }

        for (int i = 1; i <= n; i++) {
            for (int j = m; j >= 1; j--) {
                if(j>=w[i])
                {
                    dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);
                }
            }

        }
        //輸出dp數組
//        for (int i = 1; i <= n; i++) {
//            for (int j = 1; j <= m; j++) {
//                System.out.print(dp[i][j]+" ");
//            }
//            System.out.println();
//        }
//        System.out.println(dp[n][m]);
        System.out.println(dp[m]);
        in.close();
    }
}

到此,相信大家對“Java怎么實現背包動態規劃”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女