题目:
手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢? 请你提交该整数。不要填写任何多余的内容或说明性的文字。
思路1:
DFS;递归深度为12(一共的位置),每个位置能选到的种类数为3:红珊瑚、白珊瑚、黄玛瑙;递归出口为要选择的位置到头了,全都选满;
因为是手串,是圆形的排列,得出的结果最后除以12
思路2:高中的排列组合,用数学公式算即可,得出的结果除以12
思路3:用递归,f(a,b,c,sum) = f(a - 1,b,c,sum -1) + f(a,b - 1,c,sum - 1) + f(a, b, c - 1,sum -1);得出的结果除以12
a,b,c分别是红珊瑚,白珊瑚,黄玛瑙的个数(还剩下的可选择的个数)
sum是已经选择的总的个数
(解法跟2017年蓝桥杯真题 字母组串 代码填空给的解法一致)
答案:2310
Code:
#include<bits/stdc++.h>
using namespace std;
int cnt = 0;
int getnum(int a, int b, int c,int sum){
if(a < 0 || b < 0 || c < 0) return 0;
if(sum <= 0) return 1;
return getnum(a - 1, b, c,sum - 1) + getnum(a, b - 1, c,sum - 1) + getnum(a, b, c - 1, sum - 1);
}
int main(){
cnt = getnum(3, 4, 5, 3 + 4 + 5);
cnt /= 12;
cout<<cnt<<endl;
return 0;
}