算法小疑点整型数组的含有3个元素的子集,并且子集和为0

算法小问题求一个整型数组的含有3个元素的子集,并且子集和为0
算法描述:
求一个整型数组的含有3个元素的子集,并且子集和为0。


自己写了个算法,并不是很好,
在此请各位高手帮忙写个算法,谢谢!

------解决方案--------------------
C/C++ code

#include <iostream>
using namespace std;
void cnm_sum(int n, int m, int *r)
{
    int *a = new int[m];
    if (a==NULL)
    {
        return;
    }
    int pos = 0;
    a[pos] = 0;

    while (true)
    {
        while (!(a[pos]>n-1 || pos>=m-1))
        {        
            a[pos+++1] = a[pos] + 1;
        }
        if (a[pos]>n-1)
        {
            if (pos>0)
            {
                a[--pos]++;
            }
            else
            {
                break;
            }        
        }
        else
        {
            int sum = 0;
            while (pos>=0)
            {
                sum += r[a[m-1-pos--]];
            }
            
            if(sum==0)
            {
                for(int i=0; i<m; ++i)
                {
                    cout<<r[a[i]]<<" ";
                }
                cout<<endl;
            }
            a[pos=m-1]++;
        }
    }
}

int main()
{
    int a[6]={-1,3,-2,5,6,-9};
    cnm_sum(6,3,a);

    return 0;
}

------解决方案--------------------
先把数据分成正负分别排序,先把任意两个正数相加取负数到负数数组查找,如果存在则输出,同样方法处理负数,另外如果有0,如果正数少,那么再每个正数在负数数组里查找一次,如果负数少,每个值在正数数组里查找
------解决方案--------------------
探讨

先把数据分成正负分别排序,先把任意两个正数相加取负数到负数数组查找,如果存在则输出,同样方法处理负数,另外如果有0,如果正数少,那么再每个正数在负数数组里查找一次,如果负数少,每个值在正数数组里查找

------解决方案--------------------
探讨

先把数据分成正负分别排序,先把任意两个正数相加取负数到负数数组查找,如果存在则输出,同样方法处理负数,另外如果有0,如果正数少,那么再每个正数在负数数组里查找一次,如果负数少,每个值在正数数组里查找

------解决方案--------------------
探讨

先把数据分成正负分别排序,先把任意两个正数相加取负数到负数数组查找,如果存在则输出,同样方法处理负数,另外如果有0,如果正数少,那么再每个正数在负数数组里查找一次,如果负数少,每个值在正数数组里查找

------解决方案--------------------
深搜+剪枝也挺快的
------解决方案--------------------
大家看看我的算法还能否改进
------解决方案--------------------
亲爱的这不是背包问题么
------解决方案--------------------
这不是背包问题么,只不过简单点成为固定的值 0 。建议用贪心法。
------解决方案--------------------
探讨

深搜+剪枝也挺快的

------解决方案--------------------
探讨
引用:

什么叫子集和为零?



比如一个整型数组: a[6]={-1,3,-2,5,6,-9},它有很多含有3个元素的子集如:{-1,3,-2},{-1,3,5},{-1,3,6}
{-1,6,-9}.......其中和为0的只有:子集{-1,3,-2}

------解决方案--------------------
C/C++ code

#include<stdio.h>
#include<stdlib.h>

void insert_sort(int a[], int size)
{
    int i, j;
    
    for (i = 0; i < size; ++i)
    {
        int tmp = a[i];
        
        for (j = i; j > 0; --j)
        {
            if (tmp < a[j - 1])
            {
                a[j] = a[j - 1];
            }
            else
            {
                break;
            }
        }
        
        a[j] = tmp;
    }
}
void helper(int a[], int l, int r, const int val)
{
    while (l < r)
    {
        if (0 == val + a[l] + a[r])
        {
            printf("%d + %d + %d\n", val, a[l], a[r]);
            ++l;
        }
        else if (val + a[l] + a[r] > 0)
        {
            --r;
        }
        else
        {
            ++l;
        }
    }
}

void func(int a[], int size)
{
    int i, l, r;
    int pos;
    
    insert_sort(a, size);

    for (i = 0; (i < size) && (a[i] < 0); ++i)
    {
    }

    pos = i;
    
    for (i = 0; i < pos; ++i)
    {
        helper(a, pos, size - 1, a[i]);
    }
    
    for (i = pos; i < size; ++i)
    {
        helper(a, 0, pos - 1, a[i]);
    }
}

int main()
{
    int a[] = {-1, 3, -2, 5, 6, -9, 5, -7, 8, 11, 1, -5};
    
    func(a, sizeof(a) / sizeof(a[0]));

    system("pause");
    return 0;
}