算法小问题求一个整型数组的含有3个元素的子集,并且子集和为0
算法描述:
求一个整型数组的含有3个元素的子集,并且子集和为0。
自己写了个算法,并不是很好,
在此请各位高手帮忙写个算法,谢谢!
[解决办法]
#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,如果正数少,那么再每个正数在负数数组里查找一次,如果负数少,每个值在正数数组里查找
[解决办法]
#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;}
[解决办法]
#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;}