生活随笔
收集整理的這篇文章主要介紹了
编程挑战(6)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
組合算法:開一個數組,其下標表示1到m個數,數組元素的值為1表示其下標代表的數被選中,為0則沒有選中。
?首先初始化,將數組前n個元素置1,表示第一個組合為前n個數;然后從左到右掃描數組元素值的“10”組合,找到第一個“10”組合后將其變為“01”組合,同時將其左邊的所有“1”全部移動到數組的最左端;當第一個“1”移動到數組的m-n位置,即n個“1”全部移動到最右端時,就得到了最后一個組合。
?????? 例如求5中選3的組合:
?????? 1???? 1???? 1???? 0???? 0???? //1, 2, 3
?????? 1???? 1???? 0???? 1???? 0???? //1, 2, 4
?????? 1???? 0???? 1???? 1???? 0???? //1, 3, 4
?????? 0???? 1???? 1???? 1???? 0???? //2, 3, 4
?????? 1???? 1???? 0???? 0???? 1???? //1, 2, 5
?????? 1???? 0???? 1???? 0???? 1???? //1, 3, 5
?????? 0???? 1???? 1???? 0???? 1???? //2, 3, 5
?????? 1???? 0???? 0???? 1???? 1???? //1, 4, 5
?????? 0???? 1???? 0???? 1???? 1???? //2, 4, 5
?????? 0???? 0???? 1???? 1???? 1???? //3, 4, 5
void output1(int value[], char* middle, int length)
{for(int i=0; i<length; i++){if(middle[i] == '1'){printf("%d ", value[i]);}}printf("\n");
}bool find10(char* middle, int M, int* index)
{bool find = false;for(int i=0; i<M; i++){ if (middle[i] == '1' && middle[i + 1] == '0'){*index = i;find = true;break;}}return find;
}void move1(char* middle, int index)
{int count = 0;for(int i=0; i<index; i++){if (middle[i] == '1'){swap(middle[count++], middle[i]);}}
}//從M 個數中取 N 個數的組合
void enumkind(int value[], int M, int N)
{char *middle = new char[M + 1];middle[M] = '\0';memset(middle, '1', N);memset(middle + N, '0', M - N);printf("%s: ", middle);output1(value, middle, M);int index = 0;while(find10(middle, M, &index)){swap(middle[index], middle[index+1]);move1(middle, index);printf("%s: ", middle);output1(value, middle, M);}delete middle;
}int _tmain(int argc, _TCHAR* argv[])
{int value[5] = {1,2,3,4,5};enumkind(value, sizeof(value)/sizeof(int), 4);getchar();return 0;
}
?
?
轉載于:https://www.cnblogs.com/dyllove98/p/3186867.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的编程挑战(6)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。