通过回溯实现有剪枝:题目
- 一个小孩手中有了块正方形的积木,他总是想不同的方法来搭建各种不同的楼梯。他搭建的楼梯必须满足如下条件:
要求:
1.楼梯每个台阶的砖块数不能相同,且严格递
2.每个楼梯至少包合两个台阶
3.必须用完所有的积
预计输入:10
输出:9
预计输入:5
输出:2
采用C++实现;
回溯算法;
有错求大佬指点
#include#include using namespace std; class Solution { public: int ans = 0; void backtracking(int targetsum, int sum, int k, int startIndex) { if (k < 0 || sum > targetsum) //到达最底层,和是否大于总块数 return; if (sum == targetsum) //判断是否成立 { ans++; return; } for (int i = startIndex; i < targetsum; i++) { sum = sum + i; //记录当前方块总和 if (sum > targetsum) return; backtracking(targetsum, sum, k - 1, i + 1); sum = sum - i; //回弹 } } void combine(int n) { int k = (n+1) / 2; //最大深度 backtracking(n, 0, k, 1); } }; int main() { int n; cin >> n; Solution A; A.combine(n); cout << A.ans; return 0; }



