问题描述: 将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。
/**
* @ Author zhangsf
* @CreateTime 2019/9/20 - 8:10 PM
*/
package com.bjut.qiu;
import java.util.Arrays;
import java.util.Scanner;
// 2
// 4
// 5 9 4 7
// 8
// 9 13 18 10 12 4 18 3
public class TX_Question_3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//代表测试用例个数
int T = sc.nextInt();
int n;
int output[][]=new int [T][2];
for (int i = 0; i < T; i++) {
//每一个测试用例的长度
n = sc.nextInt();
int count[]= new int[n];
sc.nextLine();
for (int j = 0; j < n; j++) {
count[j]=sc.nextInt();
}
output[i]=match(count);
}
for (int i = 0; i <output.length ; i++) {
for (int j = 0; j <output[i].length ; j++) {
System.out.println(output[i][j]);
}
}
}
private static int[] match(int[] arr) {
int sum = Arrays.stream(arr).sum();
int len =arr.length;
int halfOfSum=sum/2;
int matrix_firstDimensionLen=len+1;
int matrix_secondDimensionLen=halfOfSum+1;
int[][] matrix= new int[matrix_firstDimensionLen][matrix_secondDimensionLen];
for (int i = 0; i < matrix[0].length; i++) {
matrix[0][i]=0;
}
for (int i = 0; i < matrix.length; i++) {
matrix[i][0]=0;
}
for (int i = 1; i <matrix_firstDimensionLen ; i++) {
for (int j = 1; j < matrix_secondDimensionLen; j++) {
matrix[i][j]=matrix[i-1][j];
if (j-arr[i-1]>=0&& matrix[i-1][j-arr[i-1]]+arr[i-1]>matrix[i][j]){
matrix[i][j] = matrix[i-1][j-arr[i-1]]+arr[i-1];
}
}
}
// for (int i = 0; i <matrix.length ; i++) {
// for (int j = 0; j < matrix[i].length; j++) {
// System.out.println(matrix[i][j]+"\t");
// }
// System.out.println(" ");
// }
return new int []{matrix[len][halfOfSum],(sum-matrix[len][halfOfSum])};
}
}
输入的两个数组分别为:
5 9 4 7 分割为两部分为 12 13
9 13 18 10 12 4 18 3 分割为两部分为 43 44