『题目』:
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
『题解』:
这道题比较简单,是01背包变种,其实就是总共的任务要的时间加起来得到 sumsumsum ,然后将 sumsumsum 除以 222,因此最好的情况就是每个CPU处理 sum/2sum/2sum/2 的任务量,如果某一任务所作的任务无限接近于 sum/2sum/2sum/2,那么两个CPU之间的误差就是最小的,总时间花费也是最小的。这时候只要把背包当作 sum/2sum/2sum/2,而任务的体积是 valuevaluevalue,价值也是 valuevaluevalue。
『注意』:
该想法没有在OJ上测试过,若有错误请指点
『实现』:
import java.util.Scanner;
/**
* Author:
* Gavinjou大笨象
* Date:
* 2019-05-01
* Description:
* DP题
*/
public class beibaoOn2 {
//总共的值
private static int sum = 0;
private static int sum2 = 0;
//任务个数
private static int n = 0;
//每个任务要处理的kb数
private static int[] jobs;
//最好的cpu要做的任务数
private static int[][] num;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
jobs = new int[n];
//读取每个任务的量,同时计算和
for (int i = 0; i < n; i++)
{
jobs[i] = in.nextInt();
sum += jobs[i];
}
sum2 = sum;
//总任务量除以一半,求出背包容量
sum = sum / 2;
num = new int[sum + 1][n + 1];
for(int i = 1;i <= n; i++)
{
int valuei = jobs[i - 1];
for(int j = valuei;j <= sum;j++)
{
//究竟是装这个任务的获取的价值大,还是把容量装剩下i-1个任务
num[j][i] = Math.max(num[j-valuei][i - 1]+valuei,num[j][i - 1]);
}
}
//第一个CPU花的时间和第二个CPU花的时间
System.out.println(num[sum][n] + " "+ (sum2 - num[sum][n]));
}
}