晚会中有舞蹈组和歌唱组,要求从两组中各选一人成为组合,并且每个人只能参加一个组合。由于某些原因,指定两组中的某些人不可以组合。计算最多可以产生多少种组合方法?
const dancers = ['a', 'b', 'c'];
const singers = ['v', 'w', 'x', 'y', 'z'];
const forbidden = { a: 'x' };
const get_valid_combins = (dancers, singers, forbidden) => {
let ans = 0; // 总组数
let chosen = []; // 存放已经选过的singer
let combinations = []; // 存放已经选出的组合
const dfs = (ind) => {
if (ind === dancers.length) {
console.log('选出组合:', combinations);
ans++;
return;
}
let dancer = dancers[ind];
for (let i = 0; i < singers.length; i++) {
let singer = singers[i];
if (
(!forbidden.hasOwnProperty(dancer) ||
forbidden[dancer] !== singer) &&
!chosen.includes(singer)
) {
// 递归过程中选择singer
chosen.push(singer);
combinations.push(`${dancer}-${singer}`);
dfs(ind + 1);
// 回溯过程中删除singer
chosen.pop();
combinations.pop();
}
}
};
dfs(0);
return ans;
};
get_valid_combins(dancers, singers, forbidden);