题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import java.io.*;
import java.util.*;
import java.lang.Math;
public class Main {
public static void main(String[]args) throws IOException {
Scanner in = new Scanner(System.in);
int money = in.nextInt();
int count = in.nextInt();
int[] v = new int[count + 1];
int[] p = new int[count + 1];
int[] q = new int[count + 1];
int[] f1 = new int[count + 1];
int[] f2 = new int[count + 1];
boolean flag = true;
int dw = 100;
// 数据录入
if (money == 0 || count == 0) {
System.out.println(0);
return;
}
for (int i = 1 ; i < count + 1; i++) {
v[i] = in.nextInt();
if (flag && v[i] % dw != 0) {
dw = 10;
flag = false;
for (int m = 1 ; m < i ; m++) {
p[m] *= 10;
v[m] *= 10;
}
}
v[i] = v[i] / dw;
p[i] = in.nextInt() * v[i];
q[i] = in.nextInt();
if (q[i] > 0) {
if (f1[q[i]] == 0) {
f1[q[i]] = i;
} else {
f2[q[i]] = i;
}
}
}
// 处理数据
money /= dw;
int[][] dp = new int[count + 1][money + 1];
for (int i = 1 ; i < count + 1 ; i++) {
int p1 = 0, p2 = 0, p3 = 0;
int v1 = -1, v2 = -1, v3 = -1;
if (f1[i] != 0) {
v1 = v[i] + v[f1[i]];
p1 = p[i] + p[f1[i]];
}
if (f2[i] != 0) {
v2 = v[i] + v[f2[i]];
p2 = p[i] + p[f2[i]];
}
if (f1[i] != 0 && f2[i] != 0) {
v3 = v1 + v2 - v[i];
p3 = p1 + p2 - p[i];
}
for (int j = 1 ; j < money + 1 ; j ++) {
dp[i][j] = dp[i - 1][j];
if (q[i] == 0) {
if (j >= v[i]) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v[i]] + p[i]);
}
if (v1 != -1 && j >= v1) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v1] + p1);
}
if (v2 != -1 && j >= v2) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v2] + p2);
}
if (v3 != -1 && j >= v3) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - v3] + p3);
}
}
}
}
System.out.println(dp[count][money] * dw);
}
}
传音控股公司福利 315人发布