dfs解决自然数拆分

自然数拆分

题目描述

给定一个自然数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);
} 

猜你喜欢

转载自blog.csdn.net/weixin_43966538/article/details/106667942