1:01背包
解题策略是,按每分钟下降的分数和解题时间的比值、进行排序(先写每分钟消耗分数高的题目),01背包求解最大值
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class K {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
static String next() throws IOException {
in.nextToken();
return (String) in.sval;
}
static int a[] = new int[2005], b[] = new int[2005], c[] = new int[2005];
static int n, T, Tim;
static int dp[] = new int[5005];
public static void main(String[] args) throws IOException {
n = nextInt();
T = nextInt();
long sum = 0;
Node[] x = new Node[2005];
for (int i = 1; i <= n; i++) {
a[i] = nextInt();
}
for (int i = 1; i <= n; i++) {
b[i] = nextInt();
}
for (int i = 1; i <= n; i++) {
c[i] = nextInt();
}
for (int i = 1; i <= n; i++) {
x[i] = new Node(a[i], b[i], c[i]);
}
Arrays.sort(x, 1, n + 1);
int max = 0;
for (int i = 1; i <= n; i++) { // 01背包
for (int j = T; j >= x[i].c; j--) {
dp[j] = Math.max(dp[j], dp[j - x[i].c] + x[i].score - x[i].dec * j);
max = Math.max(dp[j], max);
}
}
out.println(max);
out.flush();
}
static class Node implements Comparable<Node> {
int score, dec, c; // 分别代表分数、 每分钟下降的得分、 与 c分钟内能解决、
public Node() {
}
public Node(int score, int dec, int c) {
this.score = score;
this.dec = dec;
this.c = c;
}
@Override
public int compareTo(Node o) {
if ((this.dec * 1.0 / this.c) < (o.dec * 1.0 / o.c)) {// 下降的分数 同 解决时间的比值 排序
return 1;
} else if ((this.dec * 1.0 / this.c) == (o.dec * 1.0 / o.c)) {
return 0;
} else {
return -1;
}
}
}
}