#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
const int a[4] = {1, 2, 5, 10};
void backup(int N)
{
if (N == 0)
{
vector<int>::iterator it = vec.begin();
for (; it != vec.end(); ++it)
cout<< *it <<" ";
cout<<endl;
return;
}
if (N < 0) return;
for (int i = 0; i < 4; ++i)
{
if (vec.empty() || a[i] >= vec.back())// 非降序,为了去掉重复的组合
{
vec.push_back(a[i]);
backup(N-a[i]);
vec.pop_back();
}
}
}
int main(int argc, char* argv[])
{
backup(20);
return 0;
}
或者
#include <iostream>
#include <string>
using namespace std;
int count = 0;
void printAll(int* a, int n, int diff, int* path, int cur)
{
if(diff == 0)
{
count++;
for(int i = 0; i < cur; i++)
{
cout << path[i] << " ";
}
cout << endl;
return;
}
for(int i = 0; i < n; i++)
{
if( (cur == 0 || a[i] >= path[cur-1]) && a[i] <= diff )
{
path[cur] = a[i];
printAll(a, n, diff-a[i], path, cur+1);
}
}
}
int main()
{
int a[] = {1,2,5,10};
int b = 20;
int* path = new int[30];
printAll(a, 4, b, path, 0);
cout << count << endl;
return 0;
}