Java 构建物品类
类似0-1背包问题
我这里将附物品看作可以改变主物品价值和价格的一个物品,也就是一个主物品拥有多组价值和价格
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
//价值 = 重要度 * 价格
//int数组中为价值/价格
List<int[][]> list = new ArrayList<>();
//主物品的id list
List<Integer> idList = new ArrayList<>();
//所有物品的主键和Good
Map<Integer,Good> goodMap = new LinkedHashMap<>();
int N,m;
N = in.nextInt();
m = in.nextInt();
for(int i = 0; i < m; i++){
int v,p,q;//价格,重要度,主附件
v = in.nextInt();
p = in.nextInt();
q = in.nextInt();
if(q == 0){
idList.add(i + 1);
}
Good good = new Good(i + 1,v,p,q);
goodMap.put(i + 1,good);
}
goodMap.forEach((k,v) ->{
int q = v.getQ();
if(q != 0){
int idF = v.getId();
if(goodMap.get(q).getId1() == 0){
goodMap.get(q).setId1(idF);
}else if(goodMap.get(q).getId2() == 0){
goodMap.get(q).setId2(idF);
}
}
});
/*
for(int i = 0; i < m; i++){
int v,p,q;//价格,重要度,主附件
v = in.nextInt();
p = in.nextInt();
q = in.nextInt();
if(q == 0){
int[][] arr = new int[4][2];
arr[0][0] = v * p;
arr[0][1] = v;
list.add(arr);
}
else{
int[][] arr = list.get(q - 1);
if(arr[1][0] == 0){
arr[1][0] = arr[0][0] + v * p;
arr[1][1] = arr[0][1] + v;
}else{
arr[2][0] = arr[0][0] + v * p;
arr[2][1] = arr[0][1] + v;
arr[3][0] = arr[1][0] + v * p;
arr[3][1] = arr[1][1] + v;
}
list.remove(q - 1);
list.add(q - 1,arr);
}
}*/
int nums = idList.size();
int[][] dp = new int[nums][N + 1];
idList.forEach(v ->{
int[][] arr = new int[4][2];
Good good = goodMap.get(v);
arr[0][0] = good.getV() * good.getP();
arr[0][1] = good.getV();
if(good.getId1() != 0){
Good good1 = goodMap.get(good.getId1());
arr[1][0] = arr[0][0] + good1.getV() * good1.getP();
arr[1][1] = arr[0][1] + good1.getV();
}
if(good.getId2() != 0){
Good good2 = goodMap.get(good.getId2());
arr[2][0] = arr[0][0] + good2.getV() * good2.getP();
arr[2][1] = arr[0][1] + good2.getV();
arr[3][0] = arr[1][0] + good2.getV() * good2.getP();
arr[3][1] = arr[1][1] + good2.getV();
}
list.add(arr);
});
for(int j = 0; j <= N; j++){
int max = 0;
int[][] arr = list.get(0);
for(int k = 0; k < 4; k++){
if((j - arr[k][1]) >= 0){
max = Math.max(max,arr[k][0]);
}
}
dp[0][j] = max;
}
for(int i = 0; i < nums; i++){
dp[i][0] = 0;
}
for(int i = 1; i < nums; i++){
for(int j = 1; j <= N; j++){
int max = dp[i-1][j];
int[][] arr = list.get(i);
for(int k = 0; k < 4; k++){
if((j - arr[k][1]) >= 0){
max = Math.max(max,dp[i-1][j - arr[k][1]] + arr[k][0]);
}
}
dp[i][j] = max;
}
}
System.out.println(dp[nums-1][N]);
}
}
class Good{
/**
* id
*/
private int id;
/**
* 价格
*/
private int v;
/**
* 重要度
*/
private int p;
/**
* 所属主键编号
*/
private int q;
/**
* 附件1 id
*/
private int id1;
/**
* 附件2 id
*/
private int id2;
public Good(int id,int v,int p,int q){
this.id = id;
this.v = v;
this.p = p;
this.q = q;
}
public int getId(){
return id;
}
public int getV(){
return v;
}
public int getP(){
return p;
}
public int getQ(){
return q;
}
public void setId1(int id1){
this.id1 = id1;
}
public int getId1(){
return id1;
}
public void setId2(int id2){
this.id2 = id2;
}
public int getId2(){
return id2;
}
}