数组(排列组合)追加求和限制值

数组(排列组合)累加求和限制值

  今日得闲,想起过往一朋友问到的一个排列组合问题,在数组中{1,5,8,9}找出任意组合,所有数字之和累加值小于或等于14。  (即:不需要考虑顺序先后),列举所有的情况,并显示最终个数。现在提出一种思路,编码如下,抛砖引玉,探讨以资更好的方法。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 在数组中{1,5,8,9}找出任意组合,所有数字之和累加值小于或等于14。
 * (即:不需要考虑顺序先后),列举所有的情况,并显示最终个数。
 * @author Dennis Zhao
 * @createdTime:2012-5-24
 * JDK 1.6.0_17
 */
public class AccumulateArith {

    private String temp = "";

    private int[] arr = {1, 5, 8, 9};

    private static int sum = 0;

    private static List<String> list = new ArrayList<String>(0);

    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            new AccumulateArith().generateData(i + 1, new AccumulateArith());
        }
        filterCombination(list);
        System.out.println("符合条件的个数:" + sum);
    }

    /**
     * 产生所有可能数据的排列组合
     * generateData
     * @param int count
     * @param AccumulateArith acc
     * @return the void
     */
    private void generateData(int count, AccumulateArith acc) {
        for (int i = 0; i < arr.length; i++) {
            this.temp = acc.temp + arr[i];
            if (count == 1) {
                //System.out.println(this.temp);
                //sum++;
                //去掉重复的
                filterDuplicate(this.temp);
            } else if ( count > 1){
                new AccumulateArith().generateData(count - 1, this);
            } else {
                continue;
            }
        }
    }

    /**
     * 去掉重复字符的
     * filterDuplicate
     * @param String str
     * @return the void
     */
    private void filterDuplicate(String str) {
        if (null != str && !"".equals(str.trim())) {
            Set<String> set = new HashSet<String>(0);
            String[] arr = new String[str.length()];
            for (int i = 0; i < str.length(); i++) {
                arr[i] = (str.charAt(i) + "");
                set.add(arr[i]);
            }
            if (set.size() > 0 && set.size() == str.length()) {
                list.add(str);
                //System.out.println(str);
                //sum++;
            }
        }
    }

    /**
     * 符合组合规则,无顺序
     * filterCombination
     * @param List<String> sList
     * @return the void
     */
    private static void filterCombination(List<String> sList) {
        if (null != sList && sList.size() > 0) {
            Map<String, String> map = new HashMap<String, String>(0);
            for (String str : sList) {
                char[] ch = str.toCharArray();
                int i = 0 , k = 0;
                char temp;
                for (i = 0; i < ch.length; i++) {
                    for (k = i + 1; k < ch.length; k++) {
                        if (ch[i] > ch[k]) {
                            temp = ch[i];
                            ch[i] = ch[k];
                            ch[k]= temp;
                        }
                    }
                }
                map.put(String.valueOf(ch), str);
            }
            Iterator<String> it = map.keySet().iterator();
            for (; it.hasNext() ; ) {
                String str = it.next();
                int accSum = 0;
                for (int i = 0; i < str.length(); i++) {
                    accSum += Integer.parseInt(str.charAt(i)+ "") ;
                }
                if (accSum <= 14) {
                    System.out.println(str);
                    sum++;
                }
            }
        }
    }
}
/**
测试效果如下:
59
58
19
18
15
158
1
5
9
8
符合条件的个数:10
*/