输出和相等的两堆数据

import java.util.*;   
/**   
 * 给定一个数据集合,把这些数据分成和相等的两堆,输出所有可能的结果。 
 */  
public class FindTwoSetsWithSameSum {    
    // 当前Stack中所有数据的和  
    private int sumInStack = 0;    
    private Stack<Integer> stack = new Stack<Integer>();    
   
    //数据降序排列(java内置升序)   
    private static void sortByDes(int[] data) {  
        Arrays.sort(data);  
        int length = data.length;  
        for (int i = 0; i < length / 2; i++) {  
            int temp = data[i];  
            data[i] = data[length - i - 1];  
            data[length - i - 1] = temp;  
        }  
    }    
    private List<String> uniqueResult = new ArrayList<String>();    
    int count = 0;  
    public void populate(int[] data) {        
        //计算数据集的和,如果不是偶数,那么直接输出“结果不存在”。        
        int sum = sum(data);  
        if (sum % 2 != 0) {  
            System.out.println("结果不存在!");  
            return;  
        }  
        /** 
         * 如果数据集的和为偶数,计算出平均数,为了减少递归的次数, 
         * 将数据从大到小排列。 
         */  
        int average = sum / 2;  
        sortByDes(data);
        
        System.out.println("源数据分成和相等的两堆数据,有如下几种情况:");;  
  
        populateTargetSets(average, data, 0, data.length);  
    }  
  
    private void populateTargetSets(int sum, int[] sourceData, int begin,  
            int end) {  
        // 判断Stack中的数据和是否等于目标值,如果是则输出当前Stack中的数据  
        if (sumInStack == sum) {  
            if (!isDuplicatedResult(stack, sourceData)) {  
                print(stack, sourceData);  
            }  
        }  
  
        for (int currentIndex = begin; currentIndex < end; currentIndex++) {  
            /* 
             * 如果当前Stack中的和加上当前index的数据小于等于目标值, 那么将当前的index的数据添加到Stack中去, 
             * 同时,将当前Stack中所有数据的和加上新添加到Stack中的数值 
             */  
            if (sumInStack + sourceData[currentIndex] <= sum) {  
                stack.push(sourceData[currentIndex]);  
                sumInStack += sourceData[currentIndex];  
                // 当前index加上1,递归调用本身  
                populateTargetSets(sum, sourceData, currentIndex + 1, end);  
                sumInStack -= (Integer) stack.pop();  
            }   
        }    
    }  
    
    private boolean isDuplicatedResult(Stack<Integer> stack, int[] sourceData) {  
        return uniqueResult.contains(stack.toString());  
    }  
  
    private void print(Stack<Integer> stack, int[] sourceData) {  
    	System.out.print("第"+(++count)+"种结果==> "); 
    	System.out.print(""+stack.toString());
        printRemainingData(stack, sourceData);  
    }   
    private void printRemainingData(Stack<Integer> stack, int[] sourceData) {  
        List<Integer> list = new ArrayList<Integer>();  
        for (int element : sourceData) {  
            list.add(element);  
        }    
        for (int element : stack) {  
            list.remove(new Integer(element));  
        }            
        System.out.println("  "+list.toString());  
  
        uniqueResult.add(stack.toString());  
        uniqueResult.add(list.toString());  
    }   
     //数据求和。   
    private int sum(int[] data) {  
        int sum = 0;  
        for (int element : data) {  
            sum += element;  
        }  
        return sum;  
    }  
  
    public static void main(String[] args) {  
        int[] sourceData = { 1, 3, 4, 5, 6, 2, 7, 8};  
        FindTwoSetsWithSameSum finder = new FindTwoSetsWithSameSum();  
        finder.populate(sourceData);  
    }  
  
}

运行结果:

时间: 2024-10-05 17:06:21

输出和相等的两堆数据的相关文章

C语言之程序中内存的来源:栈 堆 数据段

程序在运行的时候,其内存的来源主要通过三种方法:  栈  堆  数据段,总体上来讲栈是一般用来存放小内存的局部变量,堆内存和数据段的属性很像,在使用的的时候,如果这个变量是伴随程序一直存在则使用全局变量,也就是放在数据段,如果一个变量使用完了就没用了,那么就适合用堆内存(先申请,然后释放即可), 一:栈(stack): 1:栈在使用的时候是编译器自动分配内存空间的,不需要程序员的干涉,其次栈的大小是有限的,所以当我们定义的变量需要大片的内存的时候就不适合使用栈, 2:栈存放的是普通变量,栈的在使

Matlab 进行两个体数据的配准 并显示配准误差 彩色化

进行两个体数据间的配准,并且显示配准后的误差: http://cn.mathworks.com/help/images/ref/imregister.html?requestedDomain=cn.mathworks.com 这里采用的图片是matlab子带的两张MR膝盖图,"knee1.dcm" 作为参考图像,"knee2.dcm"为浮动图像! Plain Text code ? 1 2 fixed = dicomread('knee1.dcm');      %

thinkphp + easyUI 不能同时打开两张数据表?

两个linkbutton分别打开一个数据库中不同的两张数据表 现在单独打开两个是可以正确显示的. 但是如果打开了一个linkbutton1,不关掉tabs中对应的linkbutton1,再打开linkbutton2,这时linkbutton2 显示不了数据,但是如果关掉linkbutton1,再打开linkbutton2,是可以正确显示的. 求解 --------解决方案-------- 这是不可能的!thinkphp 每个表是一个对象,不可能出现你说的现象

JavaScript-3.1--获取用户的输入,输出用户输入的两数之和---ShinePans

提示用户输入两个数,然后输出用户输入的两数之和 第一次输入 ,输入处为空 第二个输入,输入处为默认27  (这里强调语句的使用) <html> <head> <meta http-equiv="content-type" content="text/html;charset=GB2312"/> <title> 3.1 让用户输入两个数字,然后输出相加的结果 </title> </head> &l

解决jeecg3.5中由于easyui的原因会加载两次数据的问题

在解决完jeecgt3.5中的这个问题:jeecg3.5中实现从一个页面跳转到另一个页面 后,发现数据会被加载两次,在网上找了半天也没找到原因,最后发现是由于调用datagrid方法太快引起的,解决方法为使用setTimeout延迟执行datagrid方法,具体如下: $(function() { //延迟200毫秒执行,否则easyui会加载两次数据 setTimeout(init, 200); }); function init() { //alert($('#jeecgDemoList')

mysql互换表中两列数据

在开发过程中,有时由于业务等需要把一个表中的两列数据进行交换. 解决方案 使用update命令,这完全得益于MySQL SQL命令功能的强大支持. 表格中原来数据类似如下: select * from product; +----+--------+| id | name   | original_price | price  | +----+----+--------+|  1 | 雪糕   |           5.00 |   3.50 | |  2 | 鲜花   |          

php执行一条insert插入两条数据其中一条乱码

显然这就是编码问题,但是问题从哪来的呢, 我把文件编码以及代码的编码都设置成utf-8了,为什么还有这个问题于是我就开始写测试脚本 第一条 mysql_query('insert into table value(1,1,"思考思考123")') 测试没有问题 第二条 $name=$_GET["name"]; mysql_query('insert into table value(1,1,"'.$name.'")') 测试出问题了,数据库竟然插

mysql整合有关联的两个数据表里的字段

在整合两个数据表时,要把B表的一个字段整合到A表中来,B表有A表的主键的外键.有两种方法(目标表TableA,来源表TableB):1.通过程序(通过php实现),分两步实现 a.查询目标表里所有的id号,放到一个数组里$arridb.遍历$arrid,根据id号,从备份表里取出对应id的记录,取目标字段值$column,赋值给目标表的对应字段 ps:若数据量太大,有可能会出现运行超时,这是也可以通过更改php的最大执行时间才解决. php文件:copdb.php 1 <?php 2 requi

如何比较excel两列数据是否相同

工作时遇到需要比较excel两列数据是否相同的问题,在网上找了些资料,将方法记录下 假设为A/B两列 方法一: excel分别对A.B列的两列数据进行对比,如果A2=B2,就返回"相同",否则返回"不同" C2=IF(A2=B2,"相同","不同"),将单元格格式下拉 如果需要区分大小写,可使用exact函数 C2=IF(EXACT(A2,B2)=TRUE,"相同","不同") 方法二: