首页 > 代码库 > C++ P2830 生成可重集的排列(算法竞赛P185)

C++ P2830 生成可重集的排列(算法竞赛P185)

//直接在P1183的基础上做几处改动;

#include<iostream>
#include<cstdio>
using namespace std;

int p[15],n,m;
int sign[15],ap[15];//标记数组;
void outans()//输出函数
{
  for(int i=1;i<=m;i++) printf("%d ",p[i]);
  printf("\n");
  return;
}
void DFS(int x)//往第x位上面放数字;
{
  if(x>m){outans();return;}
  for(int i=1;i<=10;i++)
  {
    if(ap[i]<sign[i])
    {
      ap[i]++;p[x]=i;
      DFS(x+1);
      ap[i]--;//一定做到回溯,消除痕迹;
    }
  }
}
int main()
{
  scanf("%d%d",&n,&m);
  int x;
  for(int i=1;i<=n;i++)
  {
    scanf("%d",&x);
    sign[x]++;//初始化集合,记录每个元素的出现次数;
  }
  DFS(1);//生成所有符合条件的排列;
  return 0;
}

C++ P2830 生成可重集的排列(算法竞赛P185)