int devide(int n, int m)
178 {
179 int i,j,k,l,N;
180
181 int **vector;
182 int P=pow(m,n-m);
183 vector = (int **)malloc(sizeof(int*)*P);
184 for (i=0; i<P; ++i)
185 vector[i] = (int *)malloc(sizeof(int)*m);
186 for (i=0;i<P;++i)
187 for(k=0;k<m;++k)
188 vector[i][k] = 0; <<<< m의 n-m승 개 만큼의 벡터 만들어주고
189
190 if (n<m)
191 return 0;
192
193
194
195
196 else if (n==m)
197 {
198
199
200 for(k=0;k<m;++k)
201 vector[0][k] = 1;
202
203 N=1;
204 }
205
206 else{ <<< n=m일때 1씩 공평하게 분배하는거에서 시작해서 n을 1씩 늘려간다.
207 for(k=0;k<m;++k)
208 vector[0][k] = 1;
209
210 for(N=1,l=m;l<n ;++l ){
211
212 for(j=N-1; j>=0; --j)
213 for(k=0; k<m; ++k)
214 for(i=0;i<m;++i)
215 vector[m*j+k][i]=vector[j][i];
216 for(j=0; j<N; ++j)
217 for(k=0;k<m;++k)
218 vector[m*j+k][k]=vector[m*j+k][k]+1;
219 remove_overlap(P,m,vector); <<< (1,1,1)이 n이 1 커지면서 (2,1,1),(1,2,1),(1,1,2)처럼 값이 겹치게 됐을때 중복값들을 제거
220 N=remove_overlap_cnt(P,m,vector); <<< 중복값 제거하고 개수 세주는 함수.
221
222 }
223
224
225 }
226
227
228
229
230 231 return N;
232
233 }
값은 정확히 나오는데
remove_overlap 함수 코드 >>
http://gall.dcinside.com/board/view/?id=programming&no=780624
재귀하면 10줄도안넘어감
한줄이나 두줄짜리