题目:
给定一个数N,打印所有和为N的分解形式:
如对于N=5:
1+1+1+1+1
1+1+1+2
等等。
还算比较好写的,但是第一次写了之后发现有重复的,比如对于N=3,会有1+2和2+1两种形式都出来了。
为了去掉重复的可能,递归到每一个子和的时候,只能从比前一个数大的那些数开始取。
代码:
#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
int target;
ostream_iterator<int> os(cout," ");
void search(vector<int>& have, int sum)
{
if ( sum==0)
{
copy(have.begin(),have.end(),os);
cout<<endl;
return;
}
if ( sum < 0 )
return;
int i=sum==target?1:have.back();
for(;i<=sum;i++)
{
have.push_back(i);
search(have,sum-i);
have.pop_back();
}
}
int main()
{
while(1)
{
cin>>target;
if (target==0)
break;
vector<int> have;
search(have,target);
}
}