蓝桥杯——代表团出访——C++

问题描述:

X星球要派出一个5人组成的观察团前往W星。
其中:
A国最多可以派出4人。
B国最多可以派出2人。
C国最多可以派出2人。
D国最多可以派出1人。
E国最多可以派出1人。
F国最多可以派出3人。
那么最终派往W星的观察团会有多少种国别的不同组合呢?

解决思路

 按照有重复元素的组合方法组合,并进行筛选

本质上也是形成一棵树

 

源代码

 

#include<iostream>
#include<cstring>
using namespace std;
int N=0;
int R[6]={0};  //初始化为零,方便操作 ,存放结果的数组 
int M[6]={4,2,2,1,1,3};//解决这类问题的模板 
void Display()//显示国别的函数 
{
    for(int i=0; i<6; i++ )  //遍历结果数组 
    {
        for(int j=1; j<=R[i]; j++)//各国派出多少人 
        {
            char temp='A'+i;
            cout<<temp;
         } 
    } 
    cout<<endl;
}
void Combination(int k,int goal)//组合函数 
{   
    if(k==6)   //出口,无论如何都要结束 
    {
        if(goal==0) //选择可行的结果 
        {
            Display();
            N++;
        }
        return; 
    }
    int Limit=min(goal,M[k]);//  点睛之笔,应该好好理解 
    for(int i=0; i<=Limit;i++)//位置k上可能存在的几种情况,深度优先搜索 
    {
        R[k]=i;
        Combination(k+1,goal-i);
    }
    R[k]=0;               //再这次深度优先完成之后,恢复状态,以便在此进行此深度的搜索 
}
int main()
{   
    Combination(0,5);
    cout<<N<<endl;
    return 0; 
 } 

 运行结果

 

posted @ 2018-03-31 18:48  Howbin  阅读(210)  评论(0编辑  收藏  举报