【洛谷】P1025 數的劃分(搜索、剪枝)

【題目】

https://www.luogu.org/problem/P1025

標籤:搜索、遞推、剪枝

【思路】

這裏採用遞歸的方法,爲了確保出現的方案不重複,可以規定方案中後面的數大於或等於前面的數。

begin是上一個出現的數,初始化爲1(表示第一個數從1開始)。

num代表當前還能分的數,初始是輸入的需要劃分的數n。

floors是層數(對於超過層數的搜索直接剪枝),初始是輸入的需要劃分的塊數k。

循環的上限是num/floors,避免出現因前面的數過大而導致後面的數無法取的情況。

【代碼】

#include <iostream>
using namespace std;
int result = 0;

void dfs(int begin, int num, int floors) {
	if (floors == 0) {  // 剪枝,超過k層的剪掉
		return;
	}
	for (int i = begin; i <= num / floors; i++) {
		if (floors == 1 && num - i == 0) {  // 第k層滿足條件
			result++;
		}
		else {
			dfs(i, num - i, floors - 1);
		}
	}
}

int main() {
	int n, k;
	cin >> n >> k;
	dfs(1, n, k);
	cout << result << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章