Loading

背包问题的实现

实现

import java.util.Scanner;

/**
 * Created by Kong on 2021/1/6.
 */
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[] Value = new int[N+1];
        int[] Weight = new int[N+1];
        for(int i = 1; i <= N; i++){
            Weight[i] = sc.nextInt();
            Value[i] = sc.nextInt();
        }
        System.out.println(packageQuestion1(N,M,Weight,Value));
        System.out.println(packageQuestion2(N,M,Weight,Value));
        System.out.println(packageQuestion3(N,M,Weight,Value));
        System.out.println(packageQuestion4(N,M,Weight,Value));
        System.out.println(packageQuestion5(N,M,Weight,Value));        
    }

    //0-1背包,未优化
    public static int packageQuestion1(int N, int M, int[] Weight, int[] Value){
        int[][] dp = new int[N+1][M+1];
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= M; j++){
                if(j >= Weight[i]){
                    dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-Weight[i]]+Value[i]);
                }else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[N][M];
    }

    //0-1背包,优化
    public static int packageQuestion2(int N, int M, int[] Weight, int[] Value){
        int[] dp = new int[M+1];
        for(int i = 1; i <= N; i++){
            for(int j = M; j >= Weight[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
            }
        }
        return dp[M];
    }

    //0-1背包,装满
    public static int packageQuestion3(int N, int M, int[] Weight, int[] Value){
        int[] dp = new int[M+1];
        for(int i = 1; i <= M; i++){
            dp[i] = Integer.MIN_VALUE;//(求最大值填入最小值,求最小值填入最大值)
        }
        for(int i = 1; i <= N; i++){
            for(int j = M; j >= Weight[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
            }
        }
        return dp[M];
    }

    //完全背包,未优化
    public static int packageQuestion4(int N, int M, int[] Weight, int[] Value){
        int[][] dp = new int[N+1][M+1];
        for(int i = 1; i <= N; i++){
            for(int j = 1; j <= M; j++){
                if(j >= Weight[i]){
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-Weight[i]]+Value[i]);
                }else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[N][M];
    }

    //完全背包,优化
    public static int packageQuestion5(int N, int M, int[] Weight, int[] Value){
        int[] dp = new int[M+1];
        for(int i = 1; i <= N; i++){
            for(int j = Weight[i]; j <= M; j++){
                dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
            }
        }
        return dp[M];
    }

}

参考

posted @ 2021-01-06 21:00  JesseKkk  阅读(74)  评论(0)    收藏  举报