らての精進日記

修行をします

aoj0507:Square

解法

再帰で解きました。出来るだけ縦に高く積めるものを優先し、なおかつ前に選んだものよりも低くなるようにしていく。残り0個になったら出力。

コード

#include<bits/stdc++.h>
using namespace std;

int N;
void dfs(int rest,int prev,vector<int>&vec){
    if(rest==0){
        for(int i=0;i<vec.size();i++){
            if(i)cout<<" ";
            cout<<vec[i];
        }
        cout<<endl;
        return;
    }
    for(int i=min(rest,prev);i>0;i--){
        vec.push_back(i);
        dfs(rest-i,i,vec);
        vec.pop_back();
    }
}

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);

    while(cin>>N,N){
        vector<int>step;
        dfs(N,N,step);
    }
}