问题描述
- 对排列和组合不知道怎么办了
-
对排列和组合比较陌生,所以,希望大神能解释一下————初学者,最好用C语言,嘿嘿,太复杂的看不懂。
解决方案
排列组合的定义:
http://blog.sina.com.cn/s/blog_6e5bd60d0100uo49.html
c语言举例:
http://blog.csdn.net/tjyyyangyi/article/details/7906677
解决方案二:
将数组看为一个集合,将集合分为两部分:0~s和s~e,其中0~s表示已经选出来的元素,而s~e表示还没有选择的元素。
perm(set, s, e)
{
顺序从s~e中选出一个元素与s交换(即选出一个元素)
调用perm(set, s + 1, e)
直到s>e,即剩余集合已经为空了,输出set
}
c语言代码如下:
void perm(int list[], int s, int e, void (*cbk)(int list[]))
{
int i;
if(s > e)
{
(*cbk)(list);
}
else
{
for(i = s; i <= e; i++)
{
swap(list, s, i);
perm(list, s + 1, e, cbk);
swap(list, s, i);
}
}
}
其中:
void swap(int * o, int i, int j)
{
int tmp = o[i];
o[i] = o[j];
o[j] = tmp;
}
解决方案三:
组合,每一次从集合中选出一个元素,然后对剩余的集合(n-1)进行一次k-1组合。
comb(set, subset, n, k)
{
反向从集合中选出一个元素,将这个元素放入subset中。
调用comb(set, subset, n-1, k-1)
直到只需要选一个元素为止
}
C语言代码如下:
void combine(int s[], int n, int k, void (*cbk)(int * subset, int k))
{
if(k == 0)
{
cbk(subset, k);
return;
}
for(int i = n; i >= k; i--)
{
subset[k-1] = s[i-1];
if(k > 1)
{
combine(s, i-1, k-1, cbk);
}
else
{
cbk(subset, subset_length);
}
}
}
时间: 2024-12-06 08:11:03