예를 들어 28개 중 7개를 선택한다고 했을 때
21개의 0과 7개의 1로 구성된 모든 배열을 만들어내고 싶습니다.
중복되는 경우는 발생해서는 안되고요.
어떻게 짜야할 지 막막하네요 ㅠㅠ
가장 간단하게는 28비트 카운터를 만들어서 0부터 시작하여 1씩 계속 더해가면서 1이 몇개인지 세는 루틴을 넣으면 되겠죠
피할 수 있을때 즐겨라! http://melotopia.net/b
일반적으로 nCr 에 해당하는 모든 경우의 수를 셀수있는 재귀함수를 만들어봤는데 일단 돌려보니 잘 되는거같네요 28C7 의 모든 경우를 다 출력하는게 생각보다 엄청나게 많네요
#include
int arr[28];
// nCr int n=28; int r=7;
void print(){ for(int i=0; i if(arr[i]) printf("1"); else printf("0"); } printf("\n"); }
void run(int s, int k){ if(k==0) return; for(int i = s; i arr[i] = 1; run(i+1, k-1); if(k==1) print(); arr[i] = 0; } }
int main() { run(0, 7); return 0; }
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
이걸 어찌어찌 잘 써서 짜봐야겠습니다. 감사합니다 ㅠㅠ
http://www.gnu.org/software/gsl/manual/html_node/Combinations.html
The example program below prints all subsets of the set {0,1,2,3} ordered by size. Subsets of the same size are ordered lexicographically.
#include <stdio.h> #include <gsl/gsl_combination.h> int main (void) { gsl_combination * c; size_t i; printf ("All subsets of {0,1,2,3} by size:\n") ; for (i = 0; i <= 4; i++) { c = gsl_combination_calloc (4, i); do { printf ("{"); gsl_combination_fprintf (stdout, c, " %u"); printf (" }\n"); } while (gsl_combination_next (c) == GSL_SUCCESS); gsl_combination_free (c); } return 0; }
Here is the output from the program,
$ ./a.out All subsets of {0,1,2,3} by size: { } { 0 } { 1 } { 2 } { 3 } { 0 1 } { 0 2 } { 0 3 } { 1 2 } { 1 3 } { 2 3 } { 0 1 2 } { 0 1 3 } { 0 2 3 } { 1 2 3 } { 0 1 2 3 }
All subsets of {0,1,2,3} by size: { } { 0 } { 1 } { 2 } { 3 } { 0 1 } { 0 2 } { 0 3 } { 1 2 } { 1 3 } { 2 3 } { 0 1 2 } { 0 1 3 } { 0 2 3 } { 1 2 3 } { 0 1 2 3 }
All 16 subsets are generated, and the subsets of each size are sorted lexicographically.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
가장 간단하게는 28비트 카운터를 만들어서 0부터
가장 간단하게는 28비트 카운터를 만들어서 0부터 시작하여 1씩 계속 더해가면서 1이 몇개인지 세는 루틴을 넣으면 되겠죠
피할 수 있을때 즐겨라! http://melotopia.net/b
이렇게 해보세요
일반적으로 nCr 에 해당하는 모든 경우의 수를
셀수있는 재귀함수를 만들어봤는데
일단 돌려보니 잘 되는거같네요
28C7 의 모든 경우를 다 출력하는게 생각보다 엄청나게 많네요
#include
int arr[28];
// nCr
int n=28;
int r=7;
void print(){
if(arr[i])
for(int i=0; i
printf("1");
else
printf("0");
}
printf("\n");
}
void run(int s, int k){
if(k==0) return;
for(int i = s; i arr[i] = 1;
run(i+1, k-1);
if(k==1) print();
arr[i] = 0;
}
}
int main()
{
run(0, 7);
return 0;
}
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
재귀함수군요.
이걸 어찌어찌 잘 써서 짜봐야겠습니다. 감사합니다 ㅠㅠ
gsl Combinations
http://www.gnu.org/software/gsl/manual/html_node/Combinations.html
10.7 Examples
The example program below prints all subsets of the set {0,1,2,3} ordered by size. Subsets of the same size are ordered lexicographically.
Here is the output from the program,
All 16 subsets are generated, and the subsets of each size are sorted lexicographically.
댓글 달기