前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生成1~n的排列(模板),生成可重集的排列(对应紫书P184, P185)

生成1~n的排列(模板),生成可重集的排列(对应紫书P184, P185)

作者头像
_DIY
发布2019-09-11 17:23:14
5340
发布2019-09-11 17:23:14
举报

生成1~n的排列:

代码语言:javascript
复制
#include<iostream>
using namespace std;
void print_permutation(int n, int *A, int cur)      /*n代表这个排列中的元素数*/
{
    if(cur == n)    /*边界*/
    {
        for(int i = 0; i < n; i++)
            cout << A[i] << " ";
        cout << endl;
    }
    else
        for(int i = 1; i <= n; i++)     /*在A中插入1~n这几个数*/
        {
            int ok = 1;
            for(int j = 0; j < cur; j++)
            {
                if(A[j] == i)
                    ok = 0;             /*从前的元素中已经含有i这个数时,就不再插入它*/
            }
            if(ok)
            {
                A[cur] = i;
                print_permutation(n, A, cur + 1);           /*递归*/
            }
        }
}
int main()
{
    const int maxn = 200;
    int A[maxn];
    print_permutation(5, A, 0);        /*生成由1~5组成的全排列,cur初始值设为0*/
}

生成可重集的排列:

代码语言:javascript
复制
#include<iostream>
#include<algorithm>
using namespace std;
void print_permutation(int n, int *P, int *A, int cur)
{
    if(cur == n)
    {
        for(int i = 0; i < n; i++)
            cout << A[i] << " ";
        cout << endl;
    }
    else
        for(int i = 0; i < n; i++)
        {
            if(!i || P[i] != P[i-1])
            {
                int c1 = 0, c2 = 0;
                for(int j = 0; j < cur; j++)
                {
                    if(A[j] == P[i])
                        c1++;           /*看A中有多少与P[i]相同的元素*/
                }
                for(int j = 0; j < n; j++)
                {
                    if(P[i] == P[j])
                        c2++;           /*看P中有多少与P[i]相同的元素*/
                }
                if(c1 < c2)     /*P中的那个元素还没用或还没用完,则将它存入数组A中*/
                {
                    A[cur] = P[i];
                    print_permutation(n, P, A, cur + 1);
                }
            }
        }
}
int main()
{
    const int maxn = 200;
    int P[maxn], A[maxn];
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> P[i];
    sort(P, P + n);
    print_permutation(n, P, A, 0);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档