java解法

核心思想
异或的性质:

如果一组数字的异或值为 0,说明可以划分为两个异或结果相等的子集。
异或运算满足交换律和结合律,因此排列顺序不影响结果。
最大子集总和计算:

如果异或值为 0,将权重总和减去最小值,得到最大子集总和。
如果异或值不为 0,说明无法划分,返回 -1。
排序的作用:

排序便于直接找到最小值,简化后续计算

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        // 输入权重的数量
        int size = input.nextInt();
        int[] weights = new int[size];
        
        // 输入权重列表
        for (int i = 0; i < size; i++) {
            weights[i] = input.nextInt();
        }

        // 调用方法计算结果并输出
        System.out.println(findMaxWeight(size, weights));
    }

    /**
     * 计算最大子集总和或判断是否无法划分
     *
     * @param size    权重数组的大小
     * @param weights 权重数组
     * @return        最大子集总和或 -1
     */
    public static int findMaxWeight(int size, int[] weights) {
        // 对权重数组进行升序排序
        Arrays.sort(weights);

        // 初始化最小值、异或值和总权重
        int minVal = weights[0];   // 最小值为排序后数组的第一个元素
        int xorVal = minVal;       // 初始异或值为最小值
        int totalWeight = minVal;  // 初始总权重为最小值

        // 遍历剩余的权重,计算异或值和总权重
        for (int i = 1; i < size; i++) {
            xorVal ^= weights[i];       // 累积异或值
            totalWeight += weights[i]; // 累积总权重
        }

        // 判断异或值是否为 0
        return xorVal == 0 ? totalWeight - minVal : -1;
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

核心思想
异或运算的性质:

异或运算满足交换律和结合律。
如果一组数字的异或值为 0,则说明可以划分为两个异或值相等的子集。
总和计算:

如果可以划分,总和的最大值是所有权重的总和减去最小值(即,将最小值分配到一个子集,其余权重分配到另一个子集)。
如果不能划分,直接返回 -1

const readline = require("readline");

// 创建 readline 接口,用于读取标准输入
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

// 存储输入的行
const lines = [];

// 每次读取一行时触发
rl.on("line", (line) => {
    lines.push(line);

    if (lines.length === 2) { // 当输入的行数达到两行时,开始处理
        const n = parseInt(lines[0]); // 第 1 行:权重数量
        const weights = lines[1].split(" ").map(Number); // 第 2 行:权重数组

        console.log(computeWeights(n, weights)); // 调用主逻辑函数并输出结果

        lines.length = 0; // 清空存储的行,准备接收下一组输入
    }
});

/**
 * 计算最大子集总和或判断是否无法划分
 *
 * @param {number} n 权重数量
 * @param {number[]} weights 权重数组
 * @return {number} 最大子集总和或 -1
 */
function computeWeights(n, weights) {
    // 找到最小的权重值
    const minWeight = Math.min(...weights);

    // 初始化异或值和总权重
    let bitwiseSum = 0; // 用于存储所有权重的按位异或值
    let totalSum = 0;   // 用于存储所有权重的总和

    // 遍历权重数组,累积异或值和总和
    for (let weight of weights) {
        bitwiseSum ^= weight;  // 按位异或累积
        totalSum += weight;    // 累积总和
    }

    // 判断异或值是否为 0
    if (bitwiseSum === 0) {
        // 如果异或值为 0,返回最大子集总和(总和减去最小值)
        return totalSum - minWeight;
    } else {
        // 如果异或值不为 0,返回 -1
        return -1;
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145066104"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!