首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

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

算法小问题求一个整型数组的含有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;} 


[解决办法]

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, 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;} 

热点排行