【題目】
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;
}