590
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<math.h>
void main()
{
int num,i, n;
for(num=1;num<=31;num++)
{
n=num;
printf("\n");
for(i=4;i>=0;i--)
{
if(n>=pow(2,i)){
n=n-pow(2,i);
printf("%d ",i+1);
}
}
}
}
#include<iostream>
#include<algorithm>
using namespace std;
/****
开一个数组,其下标表示1到m个数,数组元素的值为0表示其下标
代表的数被选中,为1则没选中。
****/
void combine_next_perm(const int *first, const int *last, int cnt)
{
if (first == last)
return;
int len = last - first;
int *p = new int[len];
int i;
for (i = 0; i < cnt; ++i)
{
p[i] = 0;
}
for (; i < len; ++i)
{
p[i] = 1;
}
cout<<"从"<<len<<"中选取"<<cnt<<"个"<<endl;
do
{
for (i = 0; i < len; ++i)
{
if (0 == p[i])
{
cout<<first[i]<<' ';
}
}
cout<<endl;
}while (next_permutation(p, p + len));
delete[]p;
}
int main()
{
int a[] = {1, 2, 3, 4, 5};
int i;
for (i = 1; i <= sizeof(a) / sizeof(a[0]); ++i)
{
combine_next_perm(a, a + sizeof(a) / sizeof(a[0]), i);
}
system("pause");
return 0;
}
//回溯法
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
void func(int src[], int size)
{
int i, j;
int cnt = 0;
int *table = (int *)malloc(sizeof(int) * size);
if (NULL == table)
return;
for (i = 1; i <= size; ++i)
{
int cur = 0;
table[0] = -1;
printf("从中选取%d个出来\n", i);
while (cur >= 0)
{
table[cur] += 1;
if (table[cur] < (size - (i - cur - 1)))
{
if (i - 1 == cur)
{
for (j = 0; j < i; ++j)
{
printf("%d ", src[table[j]]);
}
printf("\n");
++cnt;
}
else
{
cur += 1;
table[cur] = table[cur - 1];
}
}
else
{
cur -= 1;
}
}
}
free(table);
printf("共有%d中组合\n", cnt);
}
int main()
{
int src[] = {1, 2, 3, 4, 5};
func(src, sizeof(src) / sizeof(src[0]));
system("pause");
return 0;
}
//bit位操作
#include<stdio.h>
#include<stdlib.h>
void func(int src[], int size)
{
int cnt = 0;
int total = 1 << size;
int i, j;
printf("共有%d种组合\n", total - 1);
for (i = 1; i < total; ++i)
{
for (j = 0; j < size; ++j)
{
if (i & (1 << j))
{
printf("%d ", src[j]);
}
}
printf("\n");
}
}
int main()
{
int src[] = {1, 2, 3, 4, 5};
func(src, sizeof(src) / sizeof(src[0]));
system("pause");
return 0;
}