1.问题描述:
给定任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。当n = 7,共有14种拆分方法:
2.算法分析:
这道题目我们可以想到其实应该用递归来做,而dfs又是可以使用递归求解,我们首先可以在递归函数里进行拆分的枚举,需要拆分的数应该是能够由哪一些数相加,怎样设计递归函数dfs呢,我们应该清楚应该拆分n,比如n为7的时候,我们先拆了1,那么n还剩下6对吧,所以我们设计的dfs递归函数应该包含两个参数,比如,我们现在将n拆成了几,然后我们先拿1先拆再拿2先拆这样子做呢。
void dfs(int s, int t) {
//s是每一步拆分的数
for (int i = num[t - 1]; i <= s; i++) {
if (i < n) {
//当前数i要大于等于前1位数,且不超过n
num[t] = i;
s -=