• 组合数


    组合数

    时间限制: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 <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n, m, num, flag;
    int a[15], vis[15];
    #define mem(a) memset(a, 0, sizeof(a))
    
    void dfs(int n1, int f) {
    	a[f] = n1;
    	if (f == m) {
    		for (int i = 1; i<=m; i++)	cout << a[i];
    		cout << endl;
    		return ;
    	}
    	for (int i = n1-1; i>=1; i--) {
    		if (!vis[i]) {
    			//a[f] = i;
    			vis[i] = 1;
    			dfs(i, f+1);
    			vis[i] = 0;
    		}
    	}
    }
    
    int main() {
    	while (cin >> n >> m) {
    		for (int i = n; i>=m; i--) {
    			mem(a);
    			mem(vis);
    			dfs(i, 1);
    			//vis[i] = 0;
    		}
    	}
    	return 0;
    }
    另附上n的全排列代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int a[15], vis[15], n;
    #define mem(a) memset(a, 0, sizeof(a))
    
    void dfs(int n1, int num) {
    	if (num == n+1) {
    		for (int i = 1; i<=n; i++)	cout << a[i];
    		cout << endl;
    		return ;
    	}
    	for (int i = 1; i<=n; i++) {
    		if (!vis[i]) {
    			vis[i] = 1;
    			a[num] = i;
    			dfs(i, num+1);
    			vis[i] = 0;
    		}
    	}
    }
    
    int main() {
    	while (cin >> n) {
    		
    		mem(a);
    		mem(vis);
    		dfs(n, 1);		
    	}
    }



  • 相关阅读:
    集合
    二维数组
    数组案例
    数组
    date time 和string
    if和for的案例
    if条件语句 for循环语句
    Windows Azure Mangement API 之 更方便的使用Mangement API
    Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
    Windows Azure Table storage 之 动态Table类 DynamicTableEntity
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194778.html
Copyright © 2020-2023  润新知