纯01背包问题-DP

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯01背包问题-DP相关的知识,希望对你有一定的参考价值。

纯01背包问题
骨头收集者有一个大袋子,里面装有V,而且在收集骨头的过程中,很明显,不同的骨骼具有不同的值和不同的体积,现在给定沿途的每个骨骼的值,您能否计算出骨骼收集器可以获得的总值的最大值?

输入值

第一行包含整数T,即案例数。
其后是T个案例,每个案例三行,第一行包含两个整数N,V(N <= 1000,V <= 1000),它们表示骨头种数和包的体积。第二行包含N个整数代表每个骨骼价值。第三行包含N个整数代表骨骼的体积。

输出量

每行一个整数,代表总价值最大值(该数字将小于231)。

输入
1
5 10
1 2 3 4 5
5 4 3 2 1

输出
14

import java.util.Scanner;

public class BackPage01 {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in) ;
        int T = input.nextInt() ;
        while(T > 0){
            int N = input.nextInt() ; //骨骼的种类
            int V = input.nextInt() ; //包的体积
            int [] value = new int [N] ; //骨骼价值
            int [] volume = new int [N] ; //骨骼体积
            for(int i=0; i<N; i++){
                value[i] = input.nextInt() ;
            }
            for(int i=0; i<N; i++){
                volume[i] = input.nextInt() ;
            }
            int [][] dp = new int [N+1][V+1] ;
            for(int i=1; i<=N; i++){
                for(int j=0; j<=V; j++){
                    if(j >= volume[i-1]){//当前体积大于等于i号骨骼体积,可以加入
                        dp[i][j] = Math.max(dp[i-1][j], value[i-1] + dp[i-1][j-volume[i-1]]) ; //选择不加入和加入的最大值
                    }else{ //当前体积小于i号骨骼体积,不可以加入
                        dp[i][j] = dp[i-1][j] ;
                    }
                }
            }
            System.out.println(dp[N][V]) ;
            T -- ;
        }
    }
}

以上是关于纯01背包问题-DP的主要内容,如果未能解决你的问题,请参考以下文章

01背包问题模板代码

dp背包问题

01背包问题与动态规划(DP)

DP01背包

$01背包详解$

被遗忘的DP -01背包代码