搜索回溯:满足筛选条件的前提下计算组合方式数量
搜索回溯:满足筛选条件的前提下计算组合方式数量

搜索回溯:满足筛选条件的前提下计算组合方式数量

晚会中有舞蹈组和歌唱组,要求从两组中各选一人成为组合,并且每个人只能参加一个组合由于某些原因,指定两组中的某些人不可以组合。计算最多可以产生多少种组合方法?

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);

发表评论

邮箱地址不会被公开。