n個をk個のグループに分ける。 例えば6個を3個のグループに分けるとき、 {{1,1,4},{1,2,3},{2,2,2}} のように分けることができます。 このような配列の配列を得ることができます。 vector<vector<int> > vv; void f(int n, int k, int p, int mx, int c, vector<int> v){ if(n-c<mx*(k-v.sz))return; if(c==n){ if(v.sz==k)vv.pb(v); return; } if(mx<=p){ vector<int> v1 = v; v1.pb(1); f(n,k,1,mx,c+1,v1); mx = max(mx,p+1); v[v.sz-1]++; f(n,k,p+1,mx,c+1,v); } else{ v[v.sz-1]++; f(n,k,p+1,mx,c+1,v); } } vector<int> v; v.pb(1); vv.clear(); f(n,k,1,1,1,v);