69,373
社区成员
发帖
与我相关
我的任务
分享
//求N里取k的全部组合并输出。(k<N)
//算法:建立一数组bits[N],每个元素为0或1,
// 用以模拟一个N位的二进制整数,
// 使其从0增加到11111...(全1即最大值),
// 寻找其中1的个数为k的情况,
// 并输出bits[i]==1对应的元素即可。
#include <stdio.h>
#include <math.h>
#define N 5 //总共有N个元素
#define K 3 //取K个元素
//------------------------------------------------------------------------------
bool HasKOne(int bits[],int k)
//N个元素的数组bit[]中仅含有0或1。
//若bits[]中确有k个1,返回true,否则返回false
{
int total = 0;
for(int i=0;i<N;i++)
if(bits[i]==1)
total++;
return total==k;
}
void BinAddOne(int bits[])
//有N个元素的数组bits[]模拟一个二进制整数,使其加1
{
bool carry = false;//是否有进位
int position = 0; //当前计算到的位置(下标)
do
{
if(bits[position]==1) //若当前位是1
{
bits[position] = 0; //加1后得0
carry = true; //有进位
position++; //高一位加1
}
else //若当前位是0
{
bits[position] = 1; //加1后得1
carry = false;
}
} while (carry);//无进位时运算结束
}
void CombinationOutput(int array[], int k)
//输出有N个元素的序列array中取k个元素的全部组合
{
int bits[N] = {0};//用来模拟N位二进制整数的数组
for(int i=0;i<pow(2.0,N)-1;i++) //共需(2^N)-1次加1
{
BinAddOne(bits);
if(HasKOne(bits, k))
{
for(int j=0;j<N;j++)
{
if(bits[j]==1)
printf("%d ", array[j]);
}
printf("\n");
}
}
}
//--------------------------------------------------------------------------
int main()
{
int array[N];
for(int i=0;i<N;i++)
array[i] = i+1;
CombinationOutput(array, K);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
void select(int,int,int,int);
int main(){
select(0,5,0,8);
}
void select(int tab_num,int cnt,int i,int j){//输出tab_num个tab键盘,然后
if(i<j){
if(cnt==1){
for(int m=i;m<j;m++){
for(int n=0;n<tab_num;n++)
cout << '\t';
cout << m <<endl;
}
}else{
for(int n=0;n<tab_num;n++)
cout << '\t';
cout << i <<endl;
select(tab_num+1,cnt-1,i+1,j);
select(tab_num,cnt,i+1,j);
}
}
}