给一个整数n, n<10^18,拆成若干段,每段加起来求和。输出所有和中 <= k 的个数。k<10^18。c++dfs代码
时间: 2024-01-22 13:19:51 浏览: 72
将一个整数S随机拆分为N个在min~max之间的整数.txt
这道题可以用 DFS 来解决,每次递归中枚举当前段的长度,然后递归下去计算后面的段的和。具体实现可以参考以下代码:
```c++
#include <iostream>
using namespace std;
long long cnt = 0;
void dfs(long long n, long long cur_sum, long long pre_len, long long k) {
if (cur_sum > k) return; // 当前和已经大于 k,结束递归
if (n == 0) { // 所有段都拆完了
cnt++; // 符合条件,计数器加一
return;
}
for (long long i = 1; i <= n; i++) {
if (i > pre_len) { // 防止出现重复的方案
dfs(n - i, cur_sum + i, i, k);
}
}
}
int main() {
long long n, k;
cin >> n >> k;
dfs(n, 0, 0, k);
cout << cnt << endl;
return 0;
}
```
注意,为了避免出现重复的方案,需要限制下一段的长度不能小于上一段的长度。
阅读全文