1.求排列组合结果总数
组合:采用递归算法,根据下面第二行公式。
int sumzuhe(int N, int K) { if (K == 0) return 1; if (N == K) return 1; return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K); }
排列:采用递归。思想来自:https://blog.csdn.net/u012814856/article/details/73863086。
int sumpailie(int N,int K) { if (K ==1) return N; return sumpailie(N - 1, K - 1)*N; }
2.展示排列,组合结果。
排列:首先从(N)个中取一个数,再在剩余的一次次取一个数,每取一个数就把这位标记为取过了,以免下次再取。取够K个数之后,把K个数输出,展示结果(所以需要提前有一个数组来存 放结果)。然后再取寻找别的第K个数,依次在不断寻找别的第(K-1),(K-2),,,,,个数。取完一个数把标记位设为未取过。
void pailie(int a[],int N,int K,int level)//(K==N)时为全排列 { if (level>=K) { for (int j = 0; j < level; j++) printf("%d ", result[j]); printf("\n"); return; } for (int i = 0; i < N; i++) { if (flag[i] == false)//该位未取过 { flag[i] = true; result[level++] = a[i];//取出修改标记位 pailie(a, N, K , level);//在未被使用过的里面再选择一个 level--;//重新取别的位 flag[i] = false; } } }
组合:组合与排列不同的是:不分顺序。我们可以假设一直是从前往后选数,那么前面作为开头的数,后面就不可以再作为开头。比如:A,B,C,D。当我第一次选择第一个数为A的话,把以A为头的数选完之后,下一次选第一个数决不能是A。所以需要有一个变量来控制所选择的第一个数(下面的程序为Index)。然后再在第一个数(比如选择A)之后的数中挑选接下来的数。选择接下来的数与上面排列类似。
void zuhe(int a[], int N, int K,int index,int deep) { if (deep >= K) { for (int i = 0; i < K; i++) { printf("%d ", result[i]); } printf("\n"); return; } for (int i = index; i =K)
{
for
(
int
j = 0; j < level; j++)
printf(
"%d "
, result[j]);
printf(
"\n"
);
return
;
}
for
(
int
i = 0; i < N; i++)
{
if
(flag[i] ==
false
)
{
flag[i] =
true
;
result[level++] = a[i];
pailie(a, N, K , level);
//在未被使用过的里面再选择一个
level--;
flag[i] =
false
;
}
}
}
void
zuhe(
int
a[],
int
N,
int
K,
int
index,
int
deep)
{
if
(deep >= K)
{
for
(
int
i = 0; i < K; i++)
{
printf(
"%d "
, result[i]);
}
printf(
"\n"
);
return
;
}
for
(
int
i = index; i
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?