本文主要是介绍【台阶问题】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
问题:
思路:
回溯-分支限界法
知识点
目标函数(分支结束的情况): n==0
约束函数(截断不合理的分支): num < 2 、 i >= n-i && num == 0
限界函数(阶段不最优的分支):没有
回溯法代码:
问题:
思路:
回溯-分支限界法
知识点
剪枝函数分为约束函数
和限界函数
约束函数:避免无所谓的搜索那些已知不含答案状态
的子树。
限界函数:用于最优化
问题,剪去那些不可能含有最优答案结点
的子树。
目标函数(分支结束的情况): n==0
约束函数(截断不合理的分支): num < 2 、 i >= n-i && num == 0
限界函数(阶段不最优的分支):没有
回溯法代码:
反着做:
#include<bits/stdc++.h>
using namespace std;int dfs(int n, int last, int num)
{int result = 0;if(n == 0 && num < 2) return 0;if(n == 0 && num >= 2) return 1;for(int i = last+1; i <= n; i++){if(n-i != 0 && i >= n-i) continue;result += dfs(n-i, i, num+1);}return result;
}
int main()
{int n;cin >> n;int result = dfs(n, 0, 0);cout << result << endl;return 0;
}
正着题意做(反常识):
#include<bits/stdc++.h>using namespace std;int solve(int n, int last, int num)
{int result = 0;if(n == 0 && num >= 2) return 1;if(n == 0 && num < 2) return 0;for(int i = 1; i <= last-1; i++){result += solve(n-i, i, num+1);}return result;
}
int main()
{int n;cin >> n;cout << solve(n, n+1, 0) << endl;return 0;
}
这篇关于【台阶问题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!