
java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[41];
int sum = 0;
for (int i = 1; i <= 40; i++) {
arr[i] = sc.nextInt();
sum += arr[i];
}
sc.close();
int target = sum / 2; // 最接近的两个数乘积最大
long[] dp = new long[target + 1];
for (int i = 1; i <= 40; i++) {
for (int j = target; j >= arr[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - arr[i]] + arr[i]); // 01背包求出最接近target的数
}
}
System.out.println(dp[target] * (sum - dp[target])); // 输出两组最大乘积
}
}
java
public class Main {
public static void main(String[] args) {
System.out.println(12873625444L);
}
}
这题其实很简单,就是要分成两组,然后分别对两组求和,让求出的两个和乘积最大。假如所有数分成A和B两组,那么A和B的乘积最大值就是 ((A + B) / 2) * 2,意思就是找到一组的和最接近所有数之和的一半,也就是 (A + B) / 2,那么这它与另一组数之和相乘即可得到最大乘积。