自然数拆分
题目描述
给定一个自然数N,要求把N拆分成若干个正整数相加的形式,参与加法运算的数可以重复。N<=30。
输入格式
一个整数n。
输出格式
输出一个数,即所有方案数
样例输入:
7
样例输出:
14
解题思路
因为N比较小,所以我用的是一种比较耗时的简单的思路,dfs解决。
首先,思路很简单,比如7,可以分成1+6,那么我们考虑到接下来的问题就是考虑把6怎么分。所以很明显递归dfs是可以解决的,递归的变量就是分完之后剩下的数x,然后递归过程就是在小于等于x的数中,选择一个数进行下一步的递归。
但是比如说7,我们分成1+2+4,4接着往下分,分成了1+3,那么7=1+2+1+3,但是我们遍历第一个数字是2的情况时,我们也是存在分出2个1和1个3的情况,那么就重复计算了。所以我们在遍历时的参数可以加一个前面一个数是多少假设是y,在遍历时,我们就可以在y和x之间进行遍历,这样就可以避免重复计算了。
代码如下
#include<bits/stdc++.h>
using namespace std;
int a[50];
int ans = 0;
void dfs(int x,int y){
if(x == 0) {
ans++;
return;
}
for(int i = y; i<= x; i++) {
x -= i;
y = i;
dfs(x,y);
x += i;
}
}
int main() {
int n;
scanf("%d",&n);
for(int i = 1; i<= n/2; i++) {
dfs(n-i,i);
}
printf("%d",ans);
}