彩票和值组合计算

package com.lenxeon.utils.math;

import com.lenxeon.utils.io.JsonUtils;
import org.apache.commons.lang.ArrayUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CombinUtils {
    public static void main(String[] args) {
        //初始化的数组
        int[] arr = {2, 1, 3, 4, 5, 6, 7, 8, 9};
        //排序变成有充数组
        Arrays.sort(arr);
        //和值
        int total = 13;
        //计算
        List result = combin(total, arr, 3);
        for (Object o : result) {
            System.out.println(JsonUtils.toJson(o));
        }
        System.out.println(JsonUtils.toJson(Integer.valueOf(result.size())));
    }

    /**
     * @param total     所求的和值
     * @param arr       原始数组
     * @param fixLength //从中挑先几个,就是排列几的意思
     * @return
     */
    public static List<int[]> combin(int total, int[] arr, int fixLength) {
        CombinUtils cb = new CombinUtils();
        List result = new ArrayList();
        List<int[]> tempResult = new ArrayList();
        cb.add(null, total, arr, tempResult);
        for (int[] temp : tempResult) {
            if (fixLength == temp.length) {
                result.add(temp);
            }
        }
        return result;
    }

    /**
     *
     * @param old 用来做累加的数组
     * @param total 要求的和值
     * @param source 原数组
     * @param result 这个数组用来存满足条件的结果
     */
    private void add(int[] old, int total, int[] source, List<int[]> result) {
        int last = 0; //old数组中的最后一个数
        if (old != null && old.length > 0) {
            last = old[(old.length - 1)];
        }
        //在源数组0-9中循环
        for (int i = 0; i < source.length; i++) {
            int item = source[i];
            if (last <= item) {//假如累计数组最后的一个数是4,那么本次循环应该从4开始。
                int sum = sumArray(old);
                if (item + sum < total) {
                    int[] temp = ArrayUtils.add(old, item);
                    add(temp, total, source, result);
                } else if (item + sum == total) {
                    int[] temp = ArrayUtils.add(old, source[i]);
                    result.add(temp);
                }
            }
        }
    }

    /**
     * 计算一个数组的和
     *
     * @param arr
     * @return
     */
    public static int sumArray(int[] arr) {
        int sum = 0;
        //如果数组为空,直接返回0
        if (arr == null) {
            return sum;
        }
        for (int i : arr) {
            sum += i;
        }
        return sum;
    }
}




你可能感兴趣的:(彩票和值组合计算)