问题描述:
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; }
运行结果