具有正整数和负整数的子集和

时间:2014-05-14 09:22:00

标签: algorithm dynamic subset subset-sum

我实现了子集和问题的变体,我的输入将是正十进制和负十进制,我也需要知道子集,知道存在不幸的是它还不够。

我已尝试过在wikipedia上找到的算法,但我无法使用负数进行算法,而且我也无法找到获取子集的方法存在。

对于这种算法,有人能指出我在哪里可以找到一些伪代码,文档或实现。

1 个答案:

答案 0 :(得分:1)

我用Java编写代码 它会检查所有可能性

import java.util.*;

public class StackOverFlow {

    public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
        Set<Set<T>> sets = new HashSet<Set<T>>();
        if (originalSet.isEmpty()) {
            sets.add(new HashSet<T>());
            return sets;
        }
        List<T> list = new ArrayList<T>(originalSet);
        T head = list.get(0);
        Set<T> rest = new HashSet<T>(list.subList(1, list.size())); 
        for (Set<T> set : powerSet(rest)) {
            Set<T> newSet = new HashSet<T>();
            newSet.add(head);
            newSet.addAll(set);
            sets.add(newSet);
            sets.add(set);
        }       
        return sets;
    }

    public static int sumSet(Set<Integer> set){
        int sum =0;
        for (Integer s : set) {
            sum += s;
        }
        return sum;     
    }

    public static void main(String[] args) {
         Set<Integer> mySet = new HashSet<Integer>();
         mySet.add(-1);
         mySet.add(2);
         mySet.add(3);

         int mySum = 4;
         for (Set<Integer> s : powerSet(mySet)) {
             if(mySum == sumSet(s))
                 System.out.println(s + " = " + sumSet(s));
         }
    }
}

我希望它有所帮助