全排列,全组合(dfs)

全排列

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
//const int maxn = 1e5+5;
#define ll long long
#define MAX INT_MAX
#define FOR(i,a,b) for( int i = a;i <= b;++i)
using namespace std;
bool b[50];
int v[50],cun[50];
int n,m;
void dfs(int k)
{
    if(k==m+1)
    {
        for(int i=1;i<=m;++i)
        {
            cout<<v[cun[i]]<<" ";
            if(i==m)
            {
                cout<<endl;
            }
        }
    }
    else
    {
        for(int i=1;i<=n;++i)
        {
            if(b[i]==1)
            {
                b[i]=0;
                cun[k]=i;
                dfs(k+1);
                b[i]=1;
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        cin>>v[i];
        b[i]=1;
    }
    dfs(1);
}

全组合

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <vector>
//const int maxn = 1e5+5;
#define ll long long
#define MAX INT_MAX
#define FOR(i,a,b) for( int i = a;i <= b;++i)
using namespace std;
bool b[50];
int v[50],cun[50];
int n,m;
void dfs(int k)
{
    if(k==m+1)
    {
        for(int i=1;i<=m;++i)
        {
            cout<<v[cun[i]]<<" ";
            if(i==m)
            {
                cout<<endl;
            }
        }
    }
    else
    {
        for(int i=cun[k-1]+1;i<=n;++i)    //唯一的不同
        {
            if(b[i]==1)
            {
                b[i]=0;
                cun[k]=i;
                dfs(k+1);
                b[i]=1;
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i)
    {
        cin>>v[i];
        b[i]=1;
    }
    dfs(1);
}

原文地址:https://www.cnblogs.com/jrfr/p/10500916.html

时间: 2024-11-02 00:31:41

全排列,全组合(dfs)的相关文章

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

全排列和全组合实现

记得@老赵之前在微博上吐槽说,“有的人真是毫无长进,六年前某同事不会写程序输出全排列,昨天发邮件还是问我该怎么写,这时间浪费到我都看不下去了.” 那时候就很好奇全排列到底是什么东西,到底有多难? 今天复习的时候终于碰到这题了,结果果然自己太渣,看了好久都没明白,代码实现又是磕磕碰碰的.所以,就把它整理成笔记加深记忆,也希望能帮到和我一样的人. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.b

字符串的全排列和全组合

输入:abc 输出:bac,cba,acb,bca,cab,abc 全排列的问题: public ArrayList<String> Permutation(String str) { ArrayList<String> list = new ArrayList<String>(); if(str!=null && str.length()>0){ helper(str.toCharArray(),list,0); Collections.sort

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

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

全排列,组合问题

(1)全排列问题 1 //全排列的两种方法 2 #include <iostream> 3 using namespace std; 4 5 //方法一,采用swap方法 6 void quanpailie(char * A,int first,int n) 7 { 8 if(A==NULL) 9 { 10 cout<<"A is NULL"<<endl; 11 return; 12 } 13 if(n<=1) 14 { 15 cout<

高效率的全组合算法(Java版实现)

博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取,0表示不取.例如,对ABC三个元素进行全组合,  100表示取A,010表示取B,001表示取C,101表示取AC  110表示取AB,011表示取BC,111表示取ABC 注意到表示取法的二进制数其实就是从1到7的十进制数 推广到对n个元素进行全排列,取法就是从1到2^n-1的所有二进制形式 要

字符串的全组合

大家千万不要把全组合和全排列搞混了,给定一个字符串:abc, 全组合形式:a,b,c,ab,ac,bc,abc 全排列形式:abc,acb,bac,bca,cab,cba 下面我就讲一下全组合问题. 首先讲一下组合问题原理: n个元素选m个元素的组合问题的实现. 从后往前选取, 选定位置i后, 再在前i-1个里面选取m-1个. * 如: 1, 2, 3, 4, 5 中选取3个元素. * 1) 选取5后, 再在前4个里面选取2个, 而前4个里面选取2个又是一个子问题, 递归即可; * 2) 如果不

算法:全组合算法

public static List<int[]> combin(final int TOTAL, final int SELETED) { List<int[]> list = new ArrayList<int[]>(400000); int[] i = new int[SELETED]; for (int x = 1; x <= SELETED; x++) i[x - 1] = x; final int LAST = SELETED - 1; while (

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin