排列组合 找真子集 不包含空集

**
void solve(int cur_totalvar, int nextVar){ // 解决向量选择子集并求和 放到向量
for (int i = 0; i<cur_totalvar; ++i){
printf("%f ",num[i]);
printf("chengchangsheng\n");
// ??? 放入变量
sunMombre.sun += num[i];
}

if(cur_totalvar){
printf("\n");
//printf("*************************1\n");
sunMombre.nombre = z++; // 每个集合次数加一
sumAndNomberVector.push_back(sunMombre); // 进入向量中
sunMombre.sun= 0; //向量的和初始化为0
}

for (int i = nextVar; i<n; ++i){
//  printf("*********************2\n");
    num[cur_totalvar] = mat[i];
    solve(cur_totalvar+1,i+1);   // 
}   

}**

请大神解释

分为两个部分,一个是排列,一个是组合,排列组合就是对组合的每个结果再分成各种排列。
http://blog.csdn.net/jfcat/article/details/8785865
http://www.cnblogs.com/aijianiula/archive/2012/04/19/2457009.html