组合数
来源:互联网 发布:淘宝促销广告语大全 编辑:程序博客网 时间:2024/05/16 06:58
题目:
组合数时间限制:3000 ms | 内存限制:65535 KB难度:3描述找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。输入n、r。输出按特定顺序输出所有组合。特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。样例输入5 3样例输出543542541532531521432431421321
解答
参考大神的做法
#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 0
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 擅长排列的小明
- Handler消息传递机制
- spring mvc 注解
- js Arguments对象
- 倒排链表
- 组合数
- POJ 3268Silver Cow Party bfs最短路
- JSP六个动作详解...
- Git学习笔记(四)---工作区与暂存区
- LeetCode - Valid Parenthesis
- 黑马程序员-OC学习日记六之Block小结
- 【设计模式】HeadFirst设计模式(一):策略(Strategy)模式
- Java 强引用、 软引用、 弱引用、虚引用
- HDU 1022 火车进出站问题