南阳32--组合数(Dfs)

组合数

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
来源
[苗栋栋]原创
上传者
苗栋栋
ac:

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 using namespace std;
 6 int dis[15], vis[15], m, n;
 7 void Dfs(int a, int b)
 8 {
 9     if(b == n + 1)
10     {
11         for(int i = 1; i <= n; i++)
12             printf("%d", dis[i]);
13         printf("\n");
14         return;
15     }
16     for(int i = a; i > 0; i--)   //保证顺序;
17     {
18         if(vis[i])
19         continue;
20         vis[i] = 1;
21         dis[b] = i;
22         Dfs(i-1, b+1);       //递归;
23         vis[i] = 0;          //回溯;
24     }
25 }
26 int main()
27 {
28     while(~scanf("%d %d", &m, &n))
29     {
30         memset(vis, 0, sizeof(vis));
31         Dfs(m, 1);   //传参, “1” 为dis[]数组中以一位下标存第一个数:
32     }
33     return 0;
34 } 

 
时间: 2024-10-19 12:27:32

南阳32--组合数(Dfs)的相关文章

nyoj 32 组合数【简单dfs】

组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合.特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 #include<stdio.h> #include<string.

组合数 南阳oj32【DFS】

描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 #include <stdio.h> #include<string.h> int m,n; int vis[20]; int res[20

NYOJ---题目32组合数

组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 来源 [苗栋栋]原创 上传者 苗栋栋 分析:这是一道DFS的题,代码如下: #inc

nyoj 32 组合数

组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合.特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 #include<iostream> #include<cstrin

nyoj 32 组合数 (深搜,不错,好题)

组合数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入 输入n.r. 输出 按特定顺序输出所有组合. 特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列. 样例输入 5 3 样例输出 543 542 541 532 531 521 432 431 421 321 来源 [苗栋栋]原创 上传者 苗栋栋 与我之前做的方法不相同,以前的是直接将所有的可

深度搜索入门

深度优先搜索是搜索的手段之一.它从某个状态开始,不断地转移状态,直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此重复,直到找到最终的解. 做这类题目,抓住两样东西:1.总体上递归几次(几层)?每一次递归确定一层上的数. 2.每次递归,有几种选择的情况.所以dfs()函数,只有两部分(if.else结构):1.(if部分)若每一层都选择了,判断是否符合条件,做出题目要求的操作.2.(else部分)若还有层没有选择,就做出选择,所有选择的情况列出. 下面是几个考察dfs的题目: 1.部

Lotto(dfs)

Lotto Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submission(s) : 32   Accepted Submission(s) : 20 Problem Description In the German Lotto you have to select 6 numbers from the set {1,2,...,49}. A popular s

关于各种排列(dfs)

代码一:数字有重复: 1 #include <cstdio> 2 int n,m,a[10],arr[10]={3,4,5,6}; 3 void dfs(int v){ 4 if(v >= n){ 5 for(int i = 0;i<n;i++) 6 printf("%d ",a[i]); 7 printf("\n"); 8 return ; 9 } 10 for(int i = 0; i<m;i++){ 11 a[v] = arr[i

HDU 6203 ping ping ping(dfs序+LCA+树状数组)

http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连通.问无法通行的点最少有多少个. 思路: 贪心思维,破坏两个点的LCA是最佳的.那么怎么判断现在在(u,v)之间的路径上有没有被破坏的点呢,如果没有的话那么此时就要破坏这个lca点.一开始我们要把询问按照u和v的lca深度从大到小排序,如果某个点需要被破坏,那么它的所有子节点都可以不再需要破坏别的点

hdu 5692 Snacks(dfs时间戳+线段树)

Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2165    Accepted Submission(s): 513 Problem Description 百度科技园内有n个零食机,零食机之间通过n?1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充,零食机的价值v会时常发