• 组合数


    组合数

    时间限制: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);		
    	}
    }



  • 相关阅读:
    C# treeView添加节点 删除节点
    xml 基础
    第一章魔兽窗口
    混合开发的框架的初步见解
    node.js的初步见解
    AngularJs的理解
    jquery属性,遍历,HTML操作
    jquery中动画效果的函数
    jquery的选择器
    js操作DOM对象及怎么获取浏览器宽高
  • 原文地址:https://www.cnblogs.com/Tovi/p/6194778.html
Copyright © 2020-2023  润新知