# Backtracking# Combinations# Permutations# Greedy

d597 - 2. 便當的編號與配菜組合

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算給定配菜組合的便當編號,並輸出下一個配菜組合。如果輸入的配菜組合是最後一個,則輸出 "no next combination"。

解題思路

程式使用深度優先搜尋 (DFS) 產生所有可能的配菜組合,並按照字典順序排列。程式首先讀取 nk,然後讀取給定的配菜組合 a。DFS 函數 dfs 遞迴地產生所有可能的組合,並計算當前組合的編號。當找到與輸入組合相同的組合時,記錄其編號 fd。然後,程式繼續搜尋下一個組合,並將其儲存在 ans 陣列中。如果找到下一個組合,則輸出其編號和組合。否則,輸出 "no next combination"。

複雜度分析

  • 時間複雜度: O(C(n, k)),其中 C(n, k) 是從 n 個元素中選取 k 個元素的組合數。因為程式需要產生所有可能的組合。
  • 空間複雜度: O(k),因為程式需要儲存當前組合和下一個組合,每個組合的大小為 k。

程式碼

#include <iostream>
using namespace std;
int a[11],n,k,tmp[11],t2[11],count,fd,ans[11];
void dfs(int it,int w){
	t2[w]=tmp[it];
	if(w==k-1){
		++count;
		int ch=1;
		for(int i=0;i<k;++i)
			if(a[i]!=t2[i])ch=0;
		if(ch)
			fd=count;
		if(fd&&count==fd+1)
			for(int i=0;i<k;++i)
				ans[i]=t2[i];
		return;
	}
	for(int i=it+1;i<n;++i){
		dfs(i,w+1);
	}
}
int main(){
	cin >> n >> k;
	for(int i=0;i<n;++i)
		tmp[i]=i+1;
	for(int i=0;i<k;++i)
		cin >> a[i];
	for(int i=0;i<n;++i)
		dfs(i,0);
	cout << fd << "\n";
	if(fd==count)
		cout << "no next combination";
	else
		for(int i=0;i<k;++i)
			cout << ans[i] << " ";
}

Discussion