题解 | #购物单#
购物单
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 的区别
int sumMoney = in.nextInt();
int count = in.nextInt();
Goods[] goods = new Goods[count + 1];
int[][] arr = new int[count + 1][sumMoney + 1];
for (int i = 1; i <= count; i++) {
goods[i] = new Goods(0, 0, 0);
goods[i].goodsSet(in.nextInt(), in.nextInt(), in.nextInt());
goods[i].sumWeigh = goods[i].value * goods[i].weigh;
}
for (int i = 1; i <= count; i++) {
if (goods[i].index != 0) {
if (goods[goods[i].index].left == 0) {
goods[goods[i].index].left = i;
} else if (goods[goods[i].index].right == 0) {
goods[goods[i].index].right = i;
}
}
}
for (int i = 1; i <= count; i++) {
for (int j = 1; j <= sumMoney; j++) {
if (goods[i].index != 0) {
arr[i][j] = arr[i - 1][j];
} else {
//三种情况
//第一种选择一个
arr[i][j] = arr[i - 1][j];
if (j >= goods[i].value)
arr[i][j] = Math.max(arr[i][j],arr[i - 1][j - goods[i].value] + goods[i].sumWeigh);
if (goods[i].left != 0 && j >= goods[i].value + goods[goods[i].left].value)
arr[i][j] = Math.max(arr[i][j], Math.max(arr[i - 1][j],arr[i - 1][j - goods[i].value - goods[goods[i].left].value] + goods[i].sumWeigh + goods[goods[i].left].sumWeigh));//选择left的
if (goods[i].right != 0 && j >= goods[i].value + goods[goods[i].right].value)
arr[i][j] = Math.max(arr[i][j], Math.max(arr[i - 1][j], arr[i - 1][j - goods[i].value - goods[goods[i].right].value] + goods[i].sumWeigh + goods[goods[i].right].sumWeigh));//选择right的
if (goods[i].left != 0 && goods[i].right != 0 &&
j >= goods[i].value + goods[goods[i].right].value + goods[goods[i].left].value)
arr[i][j] = Math.max(arr[i][j], Math.max(arr[i - 1][j], arr[i - 1][j - goods[i].value - goods[goods[i].right].value - goods[goods[i].left].value] + goods[i].sumWeigh + goods[goods[i].right].sumWeigh
+ goods[goods[i].left].sumWeigh));//选择all的
}
}
/*
100 2
10 1
20 0
*/
}
System.out.print(arr[count][sumMoney]);
}
}
class Goods {
int value;
int weigh;
int index;
int sumWeigh;
int sumValue;
int left;
int right;
Goods(int v, int w, int i) {
value = v;
weigh = w;
index = i;
}
void goodsSet(int v, int w, int i) {
value = v;
weigh = w;
index = i;
}
public int setSumWeigh(int s) {
sumWeigh = s;
return s;
}
public int setSumValue(int s) {
sumValue = s;
return s;
}
}
查看7道真题和解析