P2392 kkksc03考前临时抱佛脚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个题目的难点在于我们该怎么尽量让左右大脑均分题目时间呢,我们这样想,我们先将所有题目的时间总和累加起来,取其一半。我们知道如果将这n道题目进行时间的尽量的均分的话,一般情况是会有一组时间超过一半,另外一半小于,我们选取这两半中最大的即可,这样依次累加就是答案。那么关键问题是我们如何枚举获得使得左右脑思考的时间最接近呢。我们可以肯定的是左右脑的思考时间肯定最接近累加时间除以一半。我们可以是使用01背包的思路,怎么想呢,我们让左脑的体积为总时间的一半,在不断使用01背包的方法往里加入时间,价值和体积就是思考问题的时间,最后我们能的到在一半时间内的最大思考时间,而由于之前提到的般情况是会有一组时间超过一半,另外一半小于,所以我们从总时间减去左脑的最大时间即是我们我们要求的,最后累加即可。
import java.awt.FontFormatException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br1.readLine().split(" ");
int a=aStrings.length;
int b;int answer=0;
for(b=1;b<=a;b++) {int c=Integer.parseInt(aStrings[b-1]);String[] bStrings=br1.readLine().split(" ");int g=0;for(int a1=0;a1<c;a1++) {g=g+Integer.parseInt(bStrings[a1]);}int g1=g/2;int[] d=new int[g1+1]; for(int e=1;e<=c;e++) {for(int f=g1;f>=Integer.parseInt(bStrings[e-1]);f--) {d[f]=Math.max(d[f], d[f-Integer.parseInt(bStrings[e-1])]+Integer.parseInt(bStrings[e-1]));}}///System.out.println(d[g]+ " "+ b+" "+g);answer=answer+Math.max(g-d[g1], d[g1]);
}
System.out.println(answer);
}}