1. 程式人生 > 其它 >P1157 組合的輸出

P1157 組合的輸出

目錄

題目傳送門

題目描述

題目描述

排列與組合是常用的數學方法,其中組合就是從n個元素中抽出rr個元素(不分順序且r \le n)rn),我們可以簡單地將n個元素理解為自然數1,2,…,n,從中任取rr個數。

現要求你輸出所有組合。

例如n=5,r=3,所有組合為:

12 3 , 1 2 4 , 1 2 5 , 1 3 4 ,1 3 5 , 1 4 5 , 2 3 4 , 2 3 5 , 2 4 5 , 3 4 5

輸入格式

一行兩個自然數\(n,r(1<n<21,0 \le r \le n)\)

輸出格式

所有的組合,每一個組合佔一行且其中的元素按由小到大的順序排列,每個元素佔三個字元的位置,所有的組合也按字典順序。

**注意哦!輸出時,每個數字需要33個場寬,pascal可以這樣:

write(ans:3);

輸入輸出樣例

輸入 #1複製

5 3 

輸出 #1複製

  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5

dfs演算法求解

分析

程式碼

#include<iostream>
#include<cstdio>
using namespace std;

int n, r; 
int res[100];

// 搜尋第k個數 
void dfs(int k)
{
	if(k > r)
	{
		for(int i= 1; i <= r; i++) printf("%3d", res[i]);
		puts("");
		return;
	}
	
    
    // 從上一個數緊接著往後搜
	for(int i = res[k-1]+1; i <= n; i++)
	{
		res[k] = i;
		dfs(k+1);
	}
}

int main()
{
	scanf("%d%d", &n, &r);
	dfs(1);
	return 0;
}

時間複雜度

參考文章

https://www.luogu.com.cn/problem/solution/P1157