01背包思想解决组合问题并输出组合

//01背包思想 每个数都有 选 与 不选 两种可能
#include<cstdio>
int n, r;
bool Vis[21] = {false};
void DFS(int index, int nowR){
    
    //边界
    if(index == n+1){            // 说明已经遍历完了 n个数
        if(nowR == r) {          //说明刚好选了r个数
            for(int i = 1; i <= n; i++ ){
                if(Vis[i])    printf("%d", i); //输出组合
            }
            printf("\n");
        }
        return ;
    }
    //选第index个
    if(nowR > r) return ;   //  剪枝
    Vis[index] = true;         //    标记已经用了
    DFS(index + 1, nowR + 1);
    Vis[index] = false;     //  释放
    
    //不选第index个
    DFS(index + 1, nowR);
}

int main(){
    
    scanf("%d%d", &n, &r);
    DFS(1,0);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/GLcat/p/9642251.html
今日推荐