分析
- 此题每件物品的价值为:他的等级乘他的价钱;直接在输入时初始化;
- 一个记录每件商品的重量的数组weight,一个记录每件商品的价值数组valuue,以及dp[i][j] 表示从下标为[1-i]的物品⾥任意取,放进容量
为j的背包,价值总和最⼤是多少; - 递推公式:
3.1 如果当前背包容量不够装:dp[i][j] = dp[i - 1][j];
3.2 够装: dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//总钱数(背包容量)
int m = sc.nextInt();//希望购买物品的个数(物品数目)
int[] value = new int[30];//每件物品的价值
int[] weight = new int[30];//每件物品所占背包容量
int[][] dp = new int[30][30005];
for (int i = 1; i <= m; i++) {
weight[i] = sc.nextInt();//该件商品需要的钱
value[i] = sc.nextInt() * weight[i];//该件商品的价值
}
for (int i = 1; i <= m; i++) {//物品个数
for (int j = 1; j <= n; j++) {//背包容量
if (weight[i] > j)
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);//选第i件商品或者不选
}
}
System.out.println(dp[m][n]);
}
}