题目描述
解题思路:
相关代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
/*
* 背包问题的物品下标最好从1开始。
* */
/*定义一f[i][j]数组,i表示的是前i个物品,j
表示体积不超过j,值表示最大价值
*/
int f[][] = new int[1010][1010];
int v[] = new int[1010];
int w[] = new int[1010];
int N = scanner.nextInt();
int V = scanner.nextInt();
for(int i=1;i<=N;i++){
v[i] = scanner.nextInt();
w[i] = scanner.nextInt();
}
for(int i=1;i<=N;i++)
for(int j=0;j<=V;j++)
if(j>=v[i]) f[i][j] = Math.max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
else f[i][j] = Math.max(f[i-1][j],f[i][j]);
System.out.println(f[N][V]);
}
}
如果以物品的数量来看待问题,还有另一种解法
相关代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
/*
* 背包问题的物品下标最好从1开始。
* */
/*定义一f[i][j]数组,i表示的是前i个物品,j
表示体积不超过j,值表示最大价值
*/
int f[][] = new int[1010][1010];
int v[] = new int[1010];
int w[] = new int[1010];
int N = scanner.nextInt();
int V = scanner.nextInt();
for(int i=1;i<=N;i++){
v[i] = scanner.nextInt();
w[i] = scanner.nextInt();
}
for(int i=1;i<=N;i++)
for(int j=0;j<=V;j++)
for(int k=0;k*v[i]<=j&&k<=1;k++)
f[i][j] = Math.max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
System.out.println(f[N][V]);
}
}