Dark Abyss of Yerevan
May 13, 2002, 12:51
Я тут написал небольшую прогу которая последовательно выводит все сочетания
из n цифр по m. Алгоритм работает как счетчик, т.е. крутит последнее число,
потом предпоследнее итд, при этом делает кое какие проверки. Вообщем:
/* Генерация сочетаний из n цифр по m.
abyss 11:54 AM 5/12/02
*/
#include <stdio.h>
const n=12;
const m=5;
void main(){
int i,j;
int v[m+1]; // we want to use v[1]..v[m]
bool b; // so declare it as v[m+1]
int count=0;
for(i=1;i<=m;i++)v[i]=i; // initialization
do {
for (;v[m]<=n;v[m]++){ // increment the last element
for (j=1;j<=m;j++)printf("%d ",v[j]);
printf("\n");
count++;
}
/* the last element has reached the right boundary, so make
arrangements and continue */
b=false;
for (i=m-1;i>0;i--)
if(b=v[i]+1<=n-(m-i)) break;
v[i]++;
/* v[i] incremented, now arrange elements v[j],j>i */
for (j=i+1;j<=m;j++)v[j]=v[j-1]+1;
} while (b);
printf ("Count=%d\n",count);
}
Я знаю что эта задача имеет одно очень красивое решение. Кому не лень пусть
напишет свою версию, потом сравним, оценим сложности алгоритмов итд.
из n цифр по m. Алгоритм работает как счетчик, т.е. крутит последнее число,
потом предпоследнее итд, при этом делает кое какие проверки. Вообщем:
/* Генерация сочетаний из n цифр по m.
abyss 11:54 AM 5/12/02
*/
#include <stdio.h>
const n=12;
const m=5;
void main(){
int i,j;
int v[m+1]; // we want to use v[1]..v[m]
bool b; // so declare it as v[m+1]
int count=0;
for(i=1;i<=m;i++)v[i]=i; // initialization
do {
for (;v[m]<=n;v[m]++){ // increment the last element
for (j=1;j<=m;j++)printf("%d ",v[j]);
printf("\n");
count++;
}
/* the last element has reached the right boundary, so make
arrangements and continue */
b=false;
for (i=m-1;i>0;i--)
if(b=v[i]+1<=n-(m-i)) break;
v[i]++;
/* v[i] incremented, now arrange elements v[j],j>i */
for (j=i+1;j<=m;j++)v[j]=v[j-1]+1;
} while (b);
printf ("Count=%d\n",count);
}
Я знаю что эта задача имеет одно очень красивое решение. Кому не лень пусть
напишет свою версию, потом сравним, оценим сложности алгоритмов итд.