给定一个n个整数的集合 X={x1,x2,x3,...xn}和整数y,找出和等于y的X的子集Y:
ValidOrder函数用来判定当前布尔排列是否满足条件:遍历布尔排列,若值为1,则累加X数组对于的真实值。若最终和为y,则满足条件
用到STL中的fill()填充,是为了初始化序列
next_permutation()连续生成排列序列
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool ValidOrder(int *start,int *end,int *s,int total)
{
int nSize = end - start;
int sum = 0;
for(int i = 0 ;i < nSize ;i ++)
{
if(*(start+i) == 1)
{
sum += s[i];
}
}
return sum == total;
}
int main()
{
int X[] = {10,20,30,40,50,60};
int y = 60;
int n = sizeof(X) / sizeof(int);
vector<int> v(6);
for(int k = 0 ; k <= n-1;k ++)
{
if(n-k-2 >= 0)
fill(v.begin(),v.begin()+n-k-2,0);
fill(v.begin()+n-k-1,v.end(),1);
do
{
if(ValidOrder(v.begin(),v.end(),X,y))
{
copy(v.begin(),v.end(),ostream_iterator<int>(cout,"\t"));
cout << endl;
}
}while(next_permutation(v.begin(),v.end()));
}
}