`
MouseLearnJava
  • 浏览: 465953 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

将数组分割成差值最小的子集

阅读更多

本文使用掩码实现一个功能 ==》将数组分割成差值最小的子集
代码如下:

import java.util.Arrays;

public class MinimalDifference {

	/**
	 * 将数组分割成差值最小的子集
	 */
	public void printTwoMinDiffGroups(int[] values) {

		int length = values.length;
		// 长度为length的二进制表示个数有1<<length个
		int allMasks = 1 << length;
		int min = Integer.MAX_VALUE;
		int value = 0;
		for (int i = allMasks - 1; i >= 0; i--) {
			int diff = 0;
			for (int j = 0; j < length; j++) {
				diff += (i & (1 << j)) == 0 ? values[j] : -values[j];

			}
			if (Math.abs(diff) < min) {
				min = Math.abs(diff);
				value = i;
			}
		}

		/*
		 * 将上述计算得到的value值,与二进制表示相比较
		 * 
		 * 1. value & (1 << j)) == 0 2. ((value & (1 << j)) == (1 << j))
		 */

		System.out.printf("原数组  %s 分割成两个和最接近的数组如下:\n", Arrays.toString(values));
		System.out.print("数组一的内容: ");
		for (int j = 0; j < length; j++) {
			System.out.print(((value & (1 << j)) == 0) ? values[j] + " " : "");
		}

		System.out.print("\n数组二的内容: ");
		for (int j = 0; j < length; j++) {
			System.out.print(((value & (1 << j)) == (1 << j)) ? values[j] + " "
					: "");
		}

	}

}



一个测试例子, 分割数组[1, 2, 3, 6, 4, 7, 9]。

public class Test {

	public static void main(String[] args) {
			new MinimalDifference().printTwoMinDiffGroups(new int[] { 1, 2, 3, 6,
					4, 7, 9 });
	}
}


运行结果:

原数组  [1, 2, 3, 6, 4, 7, 9] 分割成两个和最接近的数组如下:
数组一的内容: 1 2 3 6 4
数组二的内容: 7 9
1
1
分享到:
评论

相关推荐

    Veal98#CS-Wiki#10.分割等和子集1

    解题思路解法 1首先可以做个边界条件判断,数组的和 sum 如果是奇数直接返回 false把数组分割成两个子集,且每个子集的元素和相等,其实就相当于能否在数组中

    将数组转换成JSON对象

    在IT领域,将数组转换为JSON对象是一项常见且重要的技能,尤其在前后端数据交互、存储和传输数据时。从给定的文件标题和描述中,我们可以提炼出以下几个关键知识点: ### 1. JSON(JavaScript Object Notation)...

    数组子集.vi

    数组子集

    求整数数组的子集C语言

    求整数数组的子集C语言

    二维数组替换子集.vi

    二维数组替换子集

    分而治之法求一个数组最大子集

    分而治之的思想解决求一个数组的最大子集,有效的降低了时间复杂度,值得学习。

    PHP判断一个数组是另一个数组子集的方法详解

    在PHP编程中,判断一个数组是否为另一个数组的子集是一项常见的任务,这涉及到数组的比较和搜索操作。本文将详细介绍三种不同的PHP方法来实现这一功能,并解释它们的工作原理。 ### 1. 使用 `foreach` 循环和 `in_...

    子集和数 C语言求解

    通常,可以使用二维数组或链表来保存子集,然后在找到解后将其打印出来。 总的来说,子集和数问题展示了如何利用回溯法在C语言中解决组合问题。通过对所有可能子集的穷举,并在每一步检查是否达到目标和,我们可以...

    NFA确定化和DFA最小化.docx

    2. 然后,我们需要迭代地计算每个子集的映射关系,并将其合并成一个新的子集。 3. 如果新的子集和原来的子集不同,我们需要继续迭代,直到新的子集和原来的子集相同。 在实现这两个算法时,我们需要使用C++中的多种...

    董玲玉-b20200339-等子集最小割1

    多级K-Way算法是图划分的一种方法,通过多次迭代将图分割成K个大小相近的子集。在每一步,算法尝试将图的边最小化,以达到最佳的平衡分割。 3.3 遗传算法 遗传算法受到生物进化机制的启发,通过模拟选择、交叉和...

    js代码-//数组子集测试代码

    数组子集的概念是指从一个数组中选取一部分元素,形成一个新的数组,这个新数组包含原数组的部分元素。本项目提供了一段用于测试数组子集的JS代码,我们可以深入探讨其相关的JavaScript知识。 在`main.js`文件中,...

    sumofsub.rar_SumOfSub_回溯法_回溯法子集和_子集和数_子集和数问题

    - 可能会使用一个二维数组或列表来存储子集,一个一维数组来保存当前子集的元素,以及一个变量来跟踪当前子集的和。 - “www.pudn.com.txt”可能是一个包含问题描述、输入数据或其他相关信息的文本文件。 4. **...

    c ++ 习题 c ++ 习题 c ++ 习题

    本篇将围绕C++习题,深入探讨其核心概念,帮助理解和掌握C++编程。 首先,C++的基础语法是所有习题的起点。这包括变量声明、数据类型(如int、char、float、double等)、运算符(如算术运算符、比较运算符、逻辑...

    is-subset-of:is-subset-of验证数组还是对象是子集

    是-的子集is-subset-of验证数组还是对象是子集。地位类别地位版本 依存关系 开发依赖 建造 执照安装$ npm install is-subset-of快速开始首先,您需要在应用程序中添加对is-subset-of的引用: const { isSubsetOf } =...

Global site tag (gtag.js) - Google Analytics