1 条题解

  • 2

    回溯算法典中典的题,看代码注释

    #include<bits/stdc++.h>
    using namespace std;
    int ans,n;
    int a[66];
    void print(int num){
    	cout<<n<<"=";
    	for(int i=0;i<num-1;i++){
    		cout<<a[i]<<"+";
    	}
    	cout<<a[num-1]<<'\n';
    }
    void dfs(int left,int last,int ind){//last表示上一个数,保证序列非降
    	if(left==0){//如果拆完了
    		ans++;
    		print(ind);
    		return;
    	}
    	for(int i=last;i<=left;i++){
    		if(i>=n)	break;//如果枚举的数比n大,退出
    		if(left<last)	break;//如果超过剩下的数,退出
    		a[ind]=i;//标记
    		dfs(left-i,i,ind+1);
    		a[ind]=0;//恢复
    	}
    }
    int main(){
    	cin>>n;
    	dfs(n,1,0);
    	cout<<ans;
    }
    
    • 1

    信息

    ID
    823
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者