package com.patience.interview.huawei;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* 超市购物单
* 动态规划 + 背包
* @author Green.Gee
* @date 2022/8/1 10:25
* @email green.gee.lu@gmail.com
*/
public class ShopBill {
/**
* input
* 1000 5
* 800 2 0
* 400 5 0
* 300 5 0
* 400 3 0
*--------------
* output
* 3500
*/
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line1 = br.readLine();
String [] sArr = line1.split("\\s");
int N = Integer.valueOf(sArr[0]) / 10;// max 32000
int m = Integer.valueOf(sArr[1]);// 600
// 二维数组整理信息
int[][] price = new int[m + 1][3];// 编号 = 价格
int[][] pricePlus = new int[m + 1][3];// 编号 = 满意度
for(int i = 1; i <= m; i++){
String line = br.readLine();
String [] s = line.split("\\s");
int v,p,q;
v = Integer.valueOf(s[0]) / 10;// 价格 / 10
p = Integer.valueOf(s[1]);// 重要度
q = Integer.valueOf(s[2]);// (主件 = 0) 或 ((附件 > 0) = 主件编号)
int content = v * p;// 满意度
if(q == 0){
price[i][0] = v;
pricePlus[i][0] = content;
}else{
if(price[q][1] == 0){// 第一件附件没有
price[q][1] = v;
pricePlus[q][1] = content;
}else{// 第二家附件
price[q][2] = v;
pricePlus[q][2] = content;
}
}
}
// 背包计算
int [] d = new int[N + 1];// 总计
for(int i = 1; i <= m; i++){
int condition = price[i][0];
System.err.println("condition is " + condition);
for(int j = N; j >= condition; j--){
int a = condition;
int a1 = pricePlus[i][0];
int b = price[i][1];
int b1 = pricePlus[i][1];
int c = price[i][2];
int c1 = pricePlus[i][2];
if(j >= a){
d[j] = Math.max(d[j],d[j - a] + a1);
}
if(j >= a + b){
d[j] = Math.max(d[j],d[j - a - b] + a1 + b1);
}
if(j >= a + c){
d[j] = Math.max(d[j],d[j - a - c] + a1 + c1);
}
if(j >= a + b + c){
d[j] = Math.max(d[j],d[j - a - b - c] + a1 + b1 + c1);
}
}
}
System.out.println(d[N] * 10);
}
}
超市购物单——动态规划 + 背包
最新推荐文章于 2024-08-27 12:22:52 发布