纯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的主要内容,如果未能解决你的问题,请参考以下文章