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

相关推荐
杜子不疼.1 分钟前
仓颉语言构造函数深度实践指南
java·服务器·前端
清空mega4 分钟前
Flask入门学习指南
后端·python·flask
风一样的美狼子4 分钟前
仓颉语言 LinkedList 链表实现深度解析
java·服务器·前端
无敌最俊朗@5 分钟前
SQLite 约束:INTEGER PRIMARY KEY 与 ROWID
java·开发语言
万邦科技Lafite5 小时前
京东按图搜索京东商品(拍立淘) API (.jd.item_search_img)快速抓取数据
开发语言·前端·数据库·python·电商开放平台·京东开放平台
丁浩6666 小时前
Python机器学习---6.集成学习与随机森林
python·随机森林·机器学习
默 语6 小时前
MySQL中的数据去重,该用DISTINCT还是GROUP BY?
java·数据库·mysql·distinct·group by·1024程序员节·数据去重
charlie1145141917 小时前
现代 Python 学习笔记:Statements & Syntax
笔记·python·学习·教程·基础·现代python·python3.13
oDeviloo8 小时前
新版IntelliJ IDEA个性化设置兼容老版习惯
java·ide·intellij-idea
一只小透明啊啊啊啊8 小时前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet