2. 01揹包問題

lankerens發表於2020-12-17

AcWing:2. 01揹包問題

在這裡插入圖片描述


01 揹包

每個物品僅有一件,只有選或者不選兩種方案

用子問題定義狀態,即 d p [ i , v ] dp[i, v] dp[i,v] 表示前 i 件物品恰放入一個容量為 v 的揹包可以獲得最大的價值,則其狀態轉移方程是

d p [ i , v ] = m a x ( d p [ i − 1 , v ] , d p [ i − 1 , v − C i ] + W i ) dp[i, v] = max(dp[i - 1, v], dp[i - 1, v - C_i] + W_i) dp[i,v]=max(dp[i1,v],dp[i1,vCi]+Wi)


優化空間複雜度

虛擬碼

dp[0...v] = 0
for i 1 to N
	for v = V to Ci
		dp[v] = max(dp[v], dp[v - Ci] + Wi)


AC Code

import java.util.*;
import static java.lang.System.out;

public class Main{
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int v = in.nextInt();
        int[][] bg = new int[n][2];
        for(int i = 0; i < n; i++){
            bg[i][0] = in.nextInt();
            bg[i][1] = in.nextInt();
        }
        
        
        int[] dp = new int[v + 1];
        for(int i = 0; i < n; i++){
            for(int j = v; j >= bg[i][0]; j--){
                dp[j] = Math.max(dp[j], dp[j - bg[i][0]] + bg[i][1]);
            }
        }
        
        out.println(dp[v]);
    }
    
}



相關文章