[蓝桥杯 2023 国 Python B] 划分 Java

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,那么这它与另一组数之和相乘即可得到最大乘积。

相关推荐
我崽不熬夜几秒前
从文件创建到删除:全面解读 Java File 类常用方法!
java·后端·java ee
Takina~5 分钟前
python打卡day54
python·深度学习·机器学习
广州山泉婚姻7 分钟前
Python函数编写指南
人工智能·python·深度学习
沛沛老爹44 分钟前
NumPy玩转数据科学
人工智能·python·机器学习·numpy·数据科学·多维数组·python库
天天摸鱼的java工程师1 小时前
如何设计一个用户签到系统,支持连续签到统计?
java·后端
晨曦5432101 小时前
针对经济学大数据的 Python 爬虫实践指南
开发语言·爬虫·python
liliangcsdn1 小时前
标书生成过程中的prompt解读
人工智能·python·信息可视化·语言模型·prompt
海海不掉头发1 小时前
【2025 年】软件体系结构考试试卷-期末考试
java·服务器·软件体系结构
智_永无止境1 小时前
集合的处理:JDK和Guava孰强孰弱?
java·jdk·集合·guava