组合(1-m中选n个数)

#include<stdio.h>
int a[100],b[100]={0},m,n;
bool p(int k)//定义一个bool类型函数 ,用来判断
{
if(b[k]==1)
{
return false;
}
return true;
}
void s(int k)//定义一个函数,用来回溯;
{

for(int i=a[k-1];i<=m;i++)
{
a[k]=i;//将i填进数组里
if(p(i))// 判定i是否用过
{
b[i]=1;//标记
if(k==n)//如果填完了
{
for(int j=1;j<=n;j++)//输出
{
printf("%d ",a[j]);
}
printf("\n");
}
else
{
s(k+1);//调用自己
}
b[i]=0;//取消标记
}
}
a[k]=0;//归零
}
int main()
{
scanf("%d%d",&m,&n);//输入m,n;
for(int i=1;i<=m;i++)//定义第一个数
{
a[1]=i;
b[i]=1;
s(2);
}

return 0;
}

hahahahahahaha

时间: 2024-11-05 22:35:24

组合(1-m中选n个数)的相关文章

递归实现从n个数中选r个数的组合数

1 #include <stdio.h> 2 #include <stdlib.h> 3 int a[100], count; 4 void comb(int m, int k) 5 { 6 int i, j; 7 for(i = m; i >= k; --i) 8 { 9 // 用来存储每个组合中的数据 10 a[k] = i; 11 if(k > 1) 12 comb(i - 1, k - 1); 13 else 14 { 15 for(j = a[0]; j &g

求集合中选一个数与当前值进行位运算的max

求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需要给定\(01/10,00,11\)的关系,总共\(8\)种. 如果是暴力的话,我们的方法有两种, 第一种是比较喜闻乐见的, 我们对于当前数\(x\),暴力计算所有存在的数\(a_i\)中,\(x\oplus a_i\)的最大值,这样的复杂度是\(O(2^{16})\)的. 另外一种也是不难考虑到的

数学算法那些事

1. 三种方法求最大公约数 1.连续整数检测法. 此算法比较简单: [php] view plain copy print? /** * greatest common divisor * * @param int $a * @param int $b */ function gcd($a, $b){ $t = $a> $b ?$b :$a; while ($t>0){ if($a%$t==0 && $b%$t ==0) break; --$t; } return $t; }

组合问题的递归实现

算法说明:从n个数中选m个数,可以分解为以下两步 (1)首先从n个数中选取编号最大的数,然后在剩下的n-1个数中选取m-1个数,直到从n-(m-1)个数中选取1个数为止. (2)从n个数中选取编号次小的一个数,继续执行第(1)步,直到当前可选编号最大的数为m. 1 #include <iostream> 2 3 using namespace std; 4 5 void Combine(int a[], int n ,int m, int b[], const int M); 6 7 int

python解决组合问题

1.问题描述 比如9个数中取4个数的组合以及列出各种组合,该如何做? 我们可以考虑以下一个简单组合:从1,2,3,4,5,6中,如何选取任意四个数的组合. 固定:1   2  3  ,组合有1234 1235 1236 固定1 2 4,组合有:1245 1246 固定1 2 5,组合有:1256 固定1 3 4,组合有:1345 1346 固定1 3 5,组合有:1356 固定1 4 5,组合有:1456 固定2 3 4,组合有:2345 2346 固定2 3 5,组合有:2356 固定2 4

排列组合总结

组合 1.位运算实现求组合: 在此介绍二进制转化法,即,将每一个组合与一个二进制数相应起来,枚举二进制的同一时候,枚举每一个组合. 如字符串:abcde,则有 00000---------null 00001---------a 00010 --------b 00011---------ab 00100---------c - - 11111--------abcde 给出程序例如以下所看到的: #include <stdio.h> #include <string.h> voi

再谈组合

#include <iostream> int num[20]; using namespace std; int sum = 0; void init(int nn, int mm) { int i; if (mm == 0)//当mm==0时,num[1]~num[5]中存储的就是枚举的这五个数 { sum++; for (int i = 1; i <= 5; i++) cout << num[i] << " "; cout <<

LeetCode 第77题 组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],] 思路: 回溯 BFS搜索 关键在于循环边界的控制. eg: n = 4 , k = 2 要求选2个数 1. 目前选了0个数 先从 1~3中选一个数 (不能选第4个数,相当于剪枝,如果第一个数就选4的话,第二个数没法选了) 2. 目前选了1个数 假设第一步在(1,2,3)中选了2,那么

搜索入门练习题3 全组合 题解

题目出处:<信息学奥赛一本通>例5.2. 题目描述 设有 \(n\) 个数的集合 \(\{1,2,...,n\}\) ,从中任意取出 \(r\) 个数进行排列 \((r \le n)\) ,试列出所有的排列. 输入格式 输入包含两个正数 \(n,r(1 \le r \le n \le 10)\) 输出格式 输出从 \(n\) 个数的集合中选出 \(r\) 个数的所有组合,每个组合方案占一行.对于每个组合,按照从小到大的顺序输出组合中的所有元素,两两之间有一个空格分隔. 样例输入 3 2 样例输