rambless
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int N = in.nextInt();
int m = in.nextInt();
Goods[] arr = new Goods[m + 1];
for (int i = 1; i <= m; i++) {
int v = in.nextInt();
int p = in.nextInt();
int q = in.nextInt();
arr[i] = new Goods(v, p, q);
}
for (int i = 1; i < arr.length; i++) {
if (arr[i].q > 0) {
if (arr[arr[i].q].a == 0) {
arr[arr[i].q].a = i;
} else {
arr[arr[i].q].b = i;
}
}
}
//构造dp二维数组dp[i][j],存放j钱数下,买前i种物品的最大满意度
int[][] dp = new int[m + 1][N + 1];
for (int i = 1; i <= m; i++) {
int v0 = 0, z0 = 0;
int v1 = 0, z1 = 0;
int v2 = 0, z2 = 0;
int v3 = 0, z3 = 0;
if (arr[i].a == 0 && arr[i].b == 0) {
v0 = arr[i].v;
z0 = arr[i].v * arr[i].p;
}
if (arr[i].a != 0 && arr[i].b == 0) {
v0 = arr[i].v;
z0 = arr[i].v * arr[i].p;
v1 = arr[i].v + arr[arr[i].a].v;
z1 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p;
}
if (arr[i].a == 0 && arr[i].b != 0) {
v0 = arr[i].v;
z0 = arr[i].v * arr[i].p;
v2 = arr[i].v + arr[arr[i].b].v;
z2 = arr[i].v * arr[i].p + arr[arr[i].b].v * arr[arr[i].b].p;
}
if (arr[i].a != 0 && arr[i].b != 0) {
v0 = arr[i].v;
z0 = arr[i].v * arr[i].p;
v1 = arr[i].v + arr[arr[i].a].v;
z1 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p;
v2 = arr[i].v + arr[arr[i].b].v;
z2 = arr[i].v * arr[i].p + arr[arr[i].b].v * arr[arr[i].b].p;
v3 = arr[i].v + arr[arr[i].a].v + arr[arr[i].b].v;
z3 = arr[i].v * arr[i].p + arr[arr[i].a].v * arr[arr[i].a].p + arr[arr[i].b].v *
arr[arr[i].b].p;
}
for (int j = 0; j <= N; j++) {
//附件时跳过及非附件时赋初始值
dp[i][j] = dp[i - 1][j];
if (arr[i].q == 0) {
if (j >= v0 && v0 > 0) {
dp[i][j] = Math.max(dp[i - 1][j - v0] + z0, dp[i][j]);
}
if (j >= v1 && v1 > 0) {
dp[i][j] = Math.max(dp[i - 1][j - v1] + z1, dp[i][j]);
}
if (j >= v2 && v2 > 0) {
dp[i][j] = Math.max(dp[i - 1][j - v2] + z2, dp[i][j]);
}
if (j >= v3 && v3 > 0) {
dp[i][j] = Math.max(dp[i - 1][j - v3] + z3, dp[i][j]);
}
}
}
}
System.out.println(dp[m][N]);
}
}
static class Goods {
public Goods(int v, int p, int q) {
this.v = v;
this.p = p;
this.q = q;
}
private int v;
private int p;
private int q;
private int a = 0;//附件1的ID
private int b = 0;//附件2的ID
}
}
深信服公司福利 891人发布
查看26道真题和解析