题目:
给定一个数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); } }