您的位置:首页 > 其它

京东2016实习笔试糖果因子最大组合

2016-04-08 21:30 344 查看
import java.util.Scanner;
import java.util.Stack;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int N = in.nextInt();
int capacity = in.nextInt();
int[] order = new int
;
int[] factor = new int
;
for (int i = 0; i < N; i++) {
order[i] = in.nextInt();
factor[i] = in.nextInt();
}
getMax(order, factor, N, capacity);

}
in.close();
}

public static void getMax(int[] order, int[] factor, int size, int capacity) {
/**
* pre记录是否当前行数据数据使得dp更大
*/
int[][] pre = new int[size + 1][capacity + 1];
int[][] dp = new int[size + 1][capacity + 1];
int maxFactor = 0;
Stack<Integer> stack = new Stack<>();
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= capacity; j++) {
if (order[i - 1] > j) {
dp[i][j] = dp[i - 1][j];
pre[i][j] = -1;
} else if (dp[i - 1][j] >= dp[i - 1][j - order[i - 1]] + factor[i - 1]) {
dp[i][j] = dp[i - 1][j];
pre[i][j] = -1;
} else {
dp[i][j] = dp[i - 1][j - order[i - 1]] + factor[i - 1];
pre[i][j] = 1;
if (factor[i - 1] > maxFactor) {
maxFactor = factor[i - 1];
}
}
}
}
int capa = dp[size][capacity];
/**
* 无满足组合时输出信息
*/
if (dp[size][capacity] == 0) {
System.out.println("0");
System.out.println("No");
} else {
System.out.println(maxFactor);
int i = size;
int j = capacity;
/**
* 记录由那些行数据组成
*/
while (capa > 0 && i >= 1 && j >= 1) {
if (pre[i][j] == 1) {
stack.push(i);
j = j - order[i - 1];
capa -= factor[i - 1];
i--;
} else {
i--;
}
}
}
while (!stack.isEmpty()) {
System.out.print(stack.pop() + " ");
}
System.out.println();
return;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: