一家著名外包公司的笔试题。
设int a[n],a中存有n个整数,又设一整数m,求a[n]的子集,使得每一子集各项的和等于m。(例如:int a[3]={1,2,3,4,},m=5,则子集为:{2,3},{1,4})。请给出解题思路,并考虑效率问题。
[解决办法]
#include <stdio.h>#include <stdlib.h>#define N 4int mask[N];void subsum (int *set, const int size, int c, int m) { int sum = 0; int i = 0; if(c == size) { for(i = 0; i < size; i++) if(mask[i] == 1) sum = sum + set[i]; if(sum == m) { printf(" { "); for(i = 0; i < size; i++) if(mask[i] == 1) printf("%d ",set[i]); printf("}\n"); } } else { mask[c] = 1; subsum(set, size, c + 1, m); mask[c] = 0; subsum(set, size, c + 1, m); } } int main () { int set[N] = {3,2,5,6}; subsum(set,N,0,11); system("PAUSE"); return 0; }