那么,对于每个分解数的范围就有了要求。
在本例中,如果第一个数字是3,为了保证不会重复,第二个数字也最小为3,第三个数字也最小为3,加和为9,不符合题意。
所以,第一个分解数的范围应该是 1 ~ n/k,第二个开始的分解数都不小于上一个分解数。
阶段划分
分析本例,初识状态为将 7 分解成 3 个数。
在第一步划分出 1 为第一个分解数后,问题规模缩小为,将 (7-1) 分解成 2 个数。
再次分解出 1 为第二个分解数后,问题规模缩小为,将 (7-1-1) 分解成 1 个数。
那么我们也可以由此总结出搜索过程的参数。
pre -- 上一个分解数 k -- 分解个数 sum -- 还剩多少需要分解
边界判定
分解个数为 0 -- k==0
完成分解 -- sum==0
根据前后阶段的分析,可以直接给出搜索函数。
// 上一个分解数pre 分解个数k 剩余待分解数sum
void
分析完核心的搜索函数后,只需要补完主函数即可。
int main() {
int n, k; //待分解数 和 分解个数
cin >> n >> k;
dfs(1, k, n); //第一个数字从 1 开始分解
cout << cnt;
return 0;
}
共 2 条回复
qp