题目描述
解题思路:
相关代码:
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]);}
}