# DFS# Backtracking# Combinations# Recursion

e179 - Runningman - 目標金額

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷在一組金額中,是否存在 k 個金額的組合,其總和恰好等於目標金額 t。

解題思路

此題可以使用深度優先搜尋 (DFS) 或回溯法來解決。我們從第一個金額開始,遞迴地選擇或不選擇每個金額。在遞迴過程中,我們追蹤已選擇的金額總和以及已選擇的金額數量。如果總和等於目標金額且選擇的金額數量等於 k,則找到解並返回 true。如果遞迴結束時仍未找到解,則返回 false。為了避免重複計算,遞迴調用時,起始索引需要遞增,確保每次只考慮尚未選擇的金額。

複雜度分析

  • 時間複雜度: O(C(n, k)),其中 n 是金額的數量,k 是需要選擇的金額數量。在最壞情況下,我們需要檢查所有可能的 k 個金額組合。
  • 空間複雜度: O(k),主要來自於遞迴調用堆疊的深度。遞迴深度最多為 k。

程式碼

#include <iostream>
using namespace std;
long long int t,a[21];
int n,k;
bool ans;
inline void dfs(int it,long long int mon,int tk){
	if(ans)return;
	if(mon==t&&tk==k){
		ans=1;
		return;
	}
	for(int i=it+1;i<n;++i)
		dfs(i,mon+a[i],tk+1);
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	while(cin >> n >> k >> t){
		ans=0;
		for(int i=0;i<n;++i)
			cin >> a[i];
		for(int i=0;i<n;++i)
			dfs(i,a[i],1);
		if(ans)
			cout << "YES\n";
		else
			cout << "NO\n";
	}
}

Discussion