void search(int t) //t: 第几次选择
{
    for(int i=1;i<=/*阈值*/;i++){
        if(/*t没有被选中过*/){
            //选中并保存目标(标记该目标为已经查看并且保存至答案数组) 
            if(/*t达到阈值*/){
                //输出整个结果数组(遍历输出) 
            }else{
                search(t+1); //search自增调用 
                //回退状态和结果(和选中并保存结果正好相反) 
            } 
        }
    }
}

#include<bits/stdc++.h>
using namespace std;
#define m 2147483647
int result[1000]={1};
int n=0,s;
int total=0;
void search(int t){
//	cout<<n<<","<<s;
	for(int i=result[t-1];i<=s;i++){
		if(i<n){
			//Bypass select
			s-=i;
			result[t]=i;
			if(s==0){
				for(int j=1;j<=t;j++){
					cout<<result[j]<<"+";
				}cout<<"\b \b";cout<<"\r\n";total+=1;
			}else{
				search(t+1);
			}s=s+i;result[t]=1;
		}
	}
}

int main()
{
	//write
	cin>>n;s=n; 
	search(1);
	cout<<"\n\nTotal:"<<total;
	return 0;
}

↑一道例题:任何一个大于一的自然数可以差分成若干小于n的自然数之和,解题过程


#转载请注明出处!