【问题标题】:Subset sum with positive and negative integers具有正整数和负整数的子集和
【发布时间】:2015-09-04 01:30:53
【问题描述】:

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

我尝试了wikipedia 上的算法,但我无法让它们与负数一起工作,而且如果存在子集,我也找不到获取子集的方法。

谁能指出我在哪里可以找到该算法的一些伪代码、文档或实现。

【问题讨论】:

  • 您检查过维基百科文章中的参考资料吗?你还在哪里搜索过?
  • 时间重要还是有效?
  • 这个 C# 版本带有回溯,它使用浮点数,您可能必须对其进行调整以避免浮点精度问题kunuk.wordpress.com/2012/12/25/backtracking-subset-sum-with-c 注意子集总和对于大输入可能会很快运行缓慢,因为它是 NP-完成
  • 是的@Khashayar 时间很重要
  • 现在我使用@Kunukn 博客文章作为基础(我也是C# 开发人员)我已经修改了代码以采用通用输入并使用十进制类型。此外,我还添加了一个停止配置以仅允许最大深度,这样至少我可以自定义它的执行方式。我知道问题是 NP Complete,所以我知道不可能知道所有可能的解决方案。如果你愿意,我可以把我的模组发给你,但我现在确定你现在会怎么做,

标签: algorithm dynamic subset subset-sum


【解决方案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));
         }
    }
}

希望对你有帮助

【讨论】:

  • 非常感谢@Khashayar,最后我采用了 Kunukn 方法,这是最适合我需要的方法。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2014-08-31
  • 2021-01-19
相关资源
最近更新 更多