import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
int money = sc.nextInt();
int m = sc.nextInt();
sc.nextLine();
money = money / 10;
//存放每件物品的价格、附件1价格,附件2价格
int [][] prices = new int[m + 1][3];
//数组存放相应物品主件、附件1、附件2的满意度
int [][] values = new int[m + 1][3];
for (int i = 1; i <= m; i++) {
int v = sc.nextInt();
int p = sc.nextInt();
int q = sc.nextInt();
//将价格/10降低计算时间复杂度,最后得到结果再乘回来
v /= 10;
p = p * v;
//主件
if (q == 0) {
prices[i][0] = v;
//第i件商品的满意度
values[i][0] = p;
} else if (prices[q][1] == 0) {
//第一件商品的附件1价格还没有填充
prices[q][1] = v;
values[q][1] = p;
} else {
//附件2
prices[q][2] = v;
values[q][2] = p;
}
sc.nextLine();
}
//定义dp数组
int [][] dp = new int[m + 1][money + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= money; j++) {
//第i件商品主件价格
int a = prices[i][0];
//第i件商品主件满意度
int b = values[i][0];
//第i件商品附件1价格
int c = prices[i][1];
//第i件商品附件1满意度
int d = values[i][1];
//第i件商品附件2价格
int e = prices[i][2];
//第i件商品附件2满意度
int f = values[i][2];
//只买主件 //当前物品的价格小于手里的钱,可以买
if (j - a >= 0) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - a] + b);
//再看能够在购买主件的基础上购买个附件
//购买主件和附件1 则从购买主件 购买主件和附件两种情况进行比较
if (j - a - c >= 0) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - a - c] + b + d);
} else {
dp[i][j] = dp[i][j];
}
//购买主件和附件2
if (j - a - e >= 0) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - a - e] + b + f);
} else {
dp[i][j] = dp[i][j];
}
//购买主件 附件1 附件2
if (j - a - c - e >= 0) {
dp[i][j] = Math.max(dp[i ][j], dp[i - 1][j - a - c - e] + b + d + f);
} else {
dp[i][j] = dp[i][j];
}
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[m][money] * 10);
}
}
}
华为机考 购物单 java动态规划解决
最新推荐文章于 2024-08-24 22:01:16 发布