算法小疑点整型数组的含有3个元素的子集,并且子集和为0
算法小问题求一个整型数组的含有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 。建议用贪心法。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
- 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; }