动态规划入门之洛谷创始人kk偷懒摆烂

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);
}
 }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值