目录
一、题目描述
二、整体思路
题目给什么,要求什么,我们就设dp数组为什么。比如题目给了物品个数N,背包容量V,那就设dp数组为int[N][V]。dp[i][j]的含义是对于要对第i个物品做出选择且背包容量为V时,可取最大的总价值。
三、代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();//物品个数
int n=scanner.nextInt();//背包容量
int[] volume=new int[m+1];//因为物品不取时个数为0,因此要保存物品数为0的情况
int[] value=new int[m+1];//物品不取时价值为0,因此要保存价值为0的情况
for(int i=1;i<=m;i++){
int vi=scanner.nextInt();
int wi=scanner.nextInt();
volume[i]=vi;
value[i]=wi;
}
System.out.print(dynamatic(m,n,volume,value));
}
public static int dynamatic(int m,int n,int[] volume,int[] value){
int[][] dp=new int[m+1][n+1];//一个物品都不取时dp[i][0]为0,背包容量为0时dp[0][i]为0
for(int i=0;i<=n;i++){
dp[0][i]=0;
}
for(int j=0;j<=m;j++){
dp[j][0]=0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(volume[i]>j){//物品体积大于背包容量,这个物品不放进背包
dp[i][j]=dp[i-1][j];
}else{//物品体积小于背包容量,比较放进去之后总价值大还是不放进去总价值大
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]);
}
}
}
return dp[m][n];
}
}