组合数

题目:

组合数
时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
找出从自然数12... 、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<stdlib.h>
int a[15];
void print(int t){
    int i;
    for (i = 0; i < t; i++)
        printf("%d", a[i]);
    printf("\n");
}
void DFS(int n,int r,int t){
    if (r == 0){
        print(t);
        return;
    }
    int i;
    for (i = n; i > 0; i--){
        a[t] = i;
        DFS(i - 1, r - 1, t + 1);
    }
}
int main(){
    int n, r;
    scanf("%d%d", &n, &r);
    DFS(n, r, 0);
    return 0;
}

对应的java代码

import java.util.Scanner;

/*
 *描述
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
 */
public class Main {
    public static int[] arr=new int[15];
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n=scanner.nextInt();
            int r=scanner.nextInt();
            DFS(n, r,0);
        }

    }

    public static void DFS(int n,int r,int t){
        if(r==0){

            print(t);
            return ;
        }
        int i;
        for(i=n;i>0;i--){
            arr[t]=i;
            DFS(i-1,r-1,t+1);
        }
    }
    public static void print(int t){
        for(int i=0;i<t;i++){
            System.out.print(arr[i]);
        }
        System.out.println();
    }
}

总结:

题目的思路也很明显,但太久没有做题,没有题感。第一感觉就不会想到用DFS深度搜索去解决。其实很多题目都是使用这种方法,题目是有点像枚举,但是要按规律的枚举。按字典序,不断地重复从大到小的排列。最好的思路就是用递归

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值