子集合加总问题研究

子集合加总问题可以简化为:

假设有一个整数集合[0,N],有一个负整数M,那么需要证明有一个集合x∩[0,N] == x的情况下,∑y (y 在x集合内) = |M|。

也就是x的子集和,与M的绝对值相等。

简单的算法,复杂度比较高。首先需要一个算法来提取[0,N]的子集。它的非空子集是2n-1个。该算法的时间复杂度也就是O(2n)。

因为算法的时候复杂度与N相关,所以该问题是一个NP问题,且是一个NPC问题。

 

该问题有两种特例

假设y∈[0,N] > |M|,那么就不存在这样的集合。
假设y∈[0,N] == |M|,那么一定存在

而且这种复杂度就会比较小,遍历N个的话,复杂度是O(n).这种特殊的情况,属于NP问题。

posted on 2009-03-19 16:05 yurow 阅读(96) 评论(1) 编辑 收藏

评论

#1楼 2009-03-20 11:31 Birdshover      

/// <summary>
/// 获取集合的所有子集算法
/// </summary>
/// <param name="collection">原始集合</param>
/// <returns></returns>
public int[][] COutChildCollection(int[] collection) {
int[][] list = new int[1 << collection.Length][];
//构造2^n个子集
for (int i = 0; i < (1 << collection.Length); i++) {
//用于运算变长子集
int[] tmp = new int[collection.Length];
int count = 0;
for (int j = 0; j < collection.Length; j++) {
//计算移位后该值是否应该被获取
if (((1 << j) & i) != 0) {
tmp[count] = collection[j];
count++;
}
}
list[i] = new int[count];
Array.Copy(tmp, 0, list[i], 0, count);
}
return list;
}
 回复 引用 查看   

导航

公告

昵称:yurow
园龄:6年4个月
粉丝:0
关注:0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

搜索

 

常用链接

随笔分类(7)

文章分类(44)

我的其它博客

友情链接

积分与排名

最新评论

阅读排行榜

推荐排行榜