去哪Q2通过80%,背包问题、分支限界、求解
如题。改半天改不出来直接交了。
上次携程笔试赛码网读输入有毒,这次特意加了一堆检查条件结果依然80%
package test.QUnaer;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static int max;
public static int current_s = 0;
public static int best = 0;
public static Queue<HeapNode> queue;
static class HeapNode {
int level;
int seat;
int maxbound;
public HeapNode(int level, int maxbound, int seat) {
this.level = level;
this.maxbound = maxbound;
this.seat = seat;
}
}
public static void main(String[] args) {
// int num = 5;
// int seats = 100;
// int[] a = {10,20,30,40,50};
Scanner sc = new Scanner(System.in);
String ipt = sc.nextLine();
int num = Integer.valueOf(ipt.split(" ")[0]);
int seats = Integer.valueOf(ipt.split(" ")[1]);
max = seats;
String[] bagg = sc.nextLine().split(" ");
int[] a = new int[bagg.length];
for (int i = 0; i < bagg.length; i++) {
a[i] = Integer.valueOf(bagg[i]);
}
Arrays.sort(a);
queue = new LinkedList<>();
if(seats!=0)
allocate(num,seats,a);
else {
if (Arrays.asList(a).contains(0) || num == 0)
System.out.println("perfect");
else
System.out.println("good");
}
}
public static int maxBound(int level, int[] bag ) {
int left = max - current_s;
int bound = current_s;
while (level <= bag.length-1 && left >= bag[level]) {
left -= bag[level];
bound+=bag[level];
level++;
}
return bound;
}
public static void addCurrentLiveNode (int level,int maxbound, int seat) {
HeapNode heapNode = new Main.HeapNode(level,maxbound,seat);
queue.add(heapNode);
}
public static void allocate(int num, int seats, int[] bag ) {
int i = 0;
int maxbound = maxBound(0,bag);
while (i!=num) {
int st = current_s + bag[i];
if (st == seats) {
best = st;
break;
}
if (st < max) {
best = current_s+bag[i]>best?current_s+bag[i]:best;
addCurrentLiveNode(i+1,maxbound,st);
}
maxbound = maxBound(i+1,bag);
if (best <= maxbound) {
addCurrentLiveNode(i+1,maxbound,current_s);
}
if (queue.isEmpty())
break;
HeapNode heapNode = queue.poll();
current_s = heapNode.seat;
maxbound = heapNode.maxbound;
i = heapNode.level;
}
if (best == max)
System.out.println("perfect");
else
System.out.println("good");
}
}
#春招##笔试题目##去哪儿##实习#

