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

原文地址:https://www.cnblogs.com/GLcat/p/9642251.html

时间: 2024-11-05 18:35:30

01背包思想解决组合问题并输出组合的相关文章

01背包思想和优化

dp入门问题:01背包装下了我们的忧伤QWQ 作为一枚乐于作死...呸,乐于学习的蒟蒻,当然要学会装包的 那么简单的描述一下01背包问题: 小明有个bag,容量是m.小明面前有n个物品,每个物品有它的价值vi和它的体积wi,小明想知道用这个背包能装到的物品总价值最大是多少. 好,这就是一个最朴素的01背包问题,那么怎么解决呢. 稍加思索...dp嘛,从小问题解决到大问题.我们用一个数组dp[i][j]表示选第i件物品时容量为j可以得到的最大价值. 状态转移方程就出来啦:dp[i][j]=max(

POJ1745Divisibility(01背包思想)

Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11151   Accepted: 3993 Description Consider an arbitrary sequence of integers. One can place + or - operators between integers in the sequence, thus deriving different arithmet

杭电1203--I NEED A OFFER!(01背包)

I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20582    Accepted Submission(s): 8214 Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要

CSU 1547 Rectangle(dp、01背包)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectangles. The area of these rectangles is 1* x or 2 * x ,and now you need find a big enough rectangle( 2 * m) so that you can put all rectangles into it(th

01背包 Codeforces Round #267 (Div. 2) C. George and Job

题目传送门 1 /* 2 题意:选择k个m长的区间,使得总和最大 3 01背包:dp[i][j] 表示在i的位置选或不选[i-m+1, i]这个区间,当它是第j个区间. 4 01背包思想,状态转移方程:dp[i][j] = max (dp[i-1][j], dp[i-m][j-1] + sum[i] - sum[i-m]); 5 在两个for循环,每一次dp[i][j]的值都要更新 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #i

SPOJ RENT 01背包的活用+二分

这个题目给定N航班的发出时间和结束时间以及价值,要求不冲突时间的最大价值 第一时间想到经典的N方DP,即对航班按发出时间排一下序之后每个i对前面的都扫一遍 时间过不了N有10万,只能想优化了,一开始想了个用树状数组记录每次加入某个航班之后 后面的所有在结束时间后的区间全部可以加一个最大值,但是首先时间区间的量更大,而且树状数组不好这么操作 后来实在没见过这种DP,还是看的别人的算法,还是挺叼的,不过其实还是沿用的背包思想 对于每个航班区间,我只需要考虑取或者不取,这样的话,对航班按出发时间S排序

TopCoder SRM502 Div1 500 贪心 01背包

原文链接https://www.cnblogs.com/zhouzhendong/p/SRM502-500.html SRM502 Div1 500 好题. 首先,如果已经确定了解决所有问题的优先级,只需要对于每一个问题是否被解决做出决策,那么显然直接 01 背包就好了. 事实上,我们是可以贪心地确定两个问题的优先程度的. 对于两个问题,假设分别为 a 和 b,则先做 a 再紧接着做 b 和先做 b 再紧接着做 a 的收益之差为 \[ \begin{eqnarray*} &&(-dec_a

动态规划的设计思想与实例(最大子段和、最长公共子序列、0-1背包、编辑距离)

动态规划算法与分治法类似,其基本思想是将总问题分解成若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解.与分治法不同的是,动态规划求解的问题经分解得到的子问题往往不是相互独立的. 基本思想: 将总问题分解成多个子问题(子问题也可以继续分解,直到无法分解),计算子问题,用一个表保存已解决的子问题的答案,算完子问题后回到总问题时从表中寻找已求得的答案,根据要求挑选最优解,加上总问题的里的具体变化再存入表中 设计步骤: 1.找出最优解的性质,并刻画其结构特征 根据具体问题找出其结构的特点,

vijos 1071 01背包+输出路径

描述 过年的时候,大人们最喜欢的活动,就是打牌了.xiaomengxian不会打牌,只好坐在一边看着. 这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了.于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量.只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了.”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌.由于数据量比较大,过了不久,大家都算得头晕了. 这时,xiaomengxian大声说:“你们看我的吧!”于