#include <stdio.h>
void swap(int *l, int *r){
int t = *l;
*l = *r;
*r = t;
}
//全排列
void gen(int *a, int size, int len)
{
int i,j;
if (size == 0){
for (i = 0; i < len; i++){
printf("%d ", (a-len)[i]);
}
puts("");
return;
}
for (i = 0; i < size; i++){
swap(a, a+i);
gen(a+1, size-1, len);
swap(a, a+i);
}
return;
}
//排列
void perm(int *a, int size, int cnt)
{
int b[10];
int i,j,k;
for (i = 0; i < (1 << size); i++){
if (bitonecnt(i) == cnt){
for (j = 0,k = 0; j < size; j++){
if (1<<j & i){
b[k++] = a[j];
}
}
gen(b, cnt, cnt);
}
}
}
int bitonecnt(int i){
int num = 0;
while(i)
{
i &= (i-1);
num++;
}
return num;
}
//组合
void compose(int *a, int size, int cnt)
{
int i,j;
for (i = 1; i < (1 << size); i++){
if (bitonecnt(i) == cnt){
for (j = 0; j < size; j++){
if (1<<j & i){
printf("%d ", a[j]);
}
}
puts("");
}
}
}
//[1,20]内和为20的5个正整数,不能重复
void calc(int *a, int size, int cnt)
{
int b[10];
int i,j,k,sum;
for (i = 0; i < (1<<size/2) - 1; i++){
if (bitonecnt(i) == cnt){
for (j = 0,k = 0; j < size/2; j++){
if (1<<j & i){
b[k++] = a[j];
}
}
sum = 0;
for(k = 0; k < cnt; k++){
sum += b[k];
}
if (sum == size){
for(k = 0; k < cnt; k++)
printf("%d ", b[k]);
puts("");
}
}
}
}
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int z[30];
int i;
for (i = 0; i < 30; i++)
{
z[i] = i+1;
}
calc(z, 20, 5);
//C5,3的所有组合
compose(a, 5, 4);
//A5,3的所有组合
perm(a, 5, 5);
}
全排列和全组合的问题
最新推荐文章于 2019-08-10 09:49:00 发布