您的位置:首页 > 其它

排列组合算法

2013-07-05 19:14 232 查看
1.排列算法

#include <stdio.h>
#define MAX_NUM 100

void print(int n, int * num)
{
int i;
for (i = 0; i < n; ++i)
printf("%d ", num[i]);
printf("\n");
}

void swap(int * a, int * b)
{
int c = *a;
*a = *b;
*b = c;
}

int _arrange(int i, int n, int * num)
{
int count = 1;
print(n, num);
while (i < n)
{
int j = i;
while (++j < n)
{
swap(num + i, num + j);
count += _arrange(i + 1, n, num);
swap(num + i, num + j);
}
++i;
}
return count;
}

int combination(int up, int down)
{
int i, j, count = 0;
int num[MAX_NUM];
for (i = 0; i < up; ++i)
num[i] = i;

i = up - 1, j = up;
while (1)
{
if (num[0] > down - up)
break;

if (num[i] > down - up + i)
{
--i;
}
else if (i == up - 1)
{
print(up, num);
++num[i];
++count;
}
else
{
++num[i];
while (i < up - 1)
{
++i;
num[i] = num[i - 1] + 1;
}
}
}
return count;
}

int arrange(int up, int down)
{
int i, j, count = 0;
int num[MAX_NUM];
for (i = 0; i < up; ++i)
num[i] = i;

i = up - 1, j = up;
while (1)
{
if (num[0] > down - up)
break;

if (num[i] > down - up + i)
{
--i;
}
else if (i == up - 1)
{
count += _arrange(0, up, num);
++num[i];
}
else
{
++num[i];
while (i < up - 1)
{
++i;
num[i] = num[i - 1] + 1;
}
}
}
return count;
}

int main()
{
//combination(9, 10);
printf("count:%d\n", arrange(6, 6));
getch();
return 0;
}


[/code]
2.组合算法

#include <stdio.h>
#define MAX_NUM 100

void print(int n, int * num)
{
int i;
for (i = 0; i < n; ++i)
printf("%d ", num[i]);
printf("\n");
}

void swap(int * a, int * b)
{
int c = *a;
*a = *b;
*b = c;
}

int _arrange(int i, int n, int * num)
{
int count = 1;
print(n, num);
while (i < n)
{
int j = i;
while (++j < n)
{
swap(num + i, num + j);
count += _arrange(i + 1, n, num);
swap(num + i, num + j);
}
++i;
}
return count;
}

int combination(int up, int down)
{
int i, j, count = 0;
int num[MAX_NUM];
for (i = 0; i < up; ++i)
num[i] = i;

i = up - 1, j = up;
while (1)
{
if (num[0] > down - up)
break;

if (num[i] > down - up + i)
{
--i;
}
else if (i == up - 1)
{
print(up, num);
++num[i];
++count;
}
else
{
++num[i];
while (i < up - 1)
{
++i;
num[i] = num[i - 1] + 1;
}
}
}
return count;
}

int arrange(int up, int down)
{
int i, j, count = 0;
int num[MAX_NUM];
for (i = 0; i < up; ++i)
num[i] = i;

i = up - 1, j = up;
while (1)
{
if (num[0] > down - up)
break;

if (num[i] > down - up + i)
{
--i;
}
else if (i == up - 1)
{
count += _arrange(0, up, num);
++num[i];
}
else
{
++num[i];
while (i < up - 1)
{
++i;
num[i] = num[i - 1] + 1;
}
}
}
return count;
}

int main()
{
//combination(9, 10);
printf("count:%d\n", arrange(3, 3));
getch();
return 0;
}


[/code]
如:combination(3,4);
输出:
123
124
134
234
也就是{1,2,3,4}组合4取3的结果
如arrange(3,4)
输出:
123
132
231
213
312
321

124
142
214
241
412
421
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: