Experimento básico 2-2.5 Descomponer un número entero en la suma de varios elementos (20 puntos) Análisis detallado de dfs

Para descomponer un entero positivo N en varios números enteros positivos y sumarlos, puede haber varios métodos de descomposición, como 7 = 6 + 1, 7 = 5 + 2, 7 = 5 + 1 + 1, .... Programa para encontrar todas las fórmulas de factorización de enteros de entero positivo N.

Formato de entrada:

Cada entrada contiene un caso de prueba, que es un entero positivo N (0 <<< N≤ \ le≤30).

Formato de salida:

Genere todas las fórmulas de descomposición de números enteros de N en orden creciente. Orden creciente significa: Para dos secuencias de descomposición N1 = N_1 = N 1 = {n1, n2, ... n_1, n_2, \ cdotsn 1, n 2, ...} y N2 = N_2 = N 2 = {m1, m2, ... m_1, m_2, \ cdotsm 1, m 2, ...}, si iii existe de modo que n1 = m1, ..., ni = min_1 = m_1, \ cdots , n_i = m_in 1 = m 1, ..., n i = m i, pero ni + 1 <mi + 1n_ {i + 1} <m_ {i + 1} n I + 1 <m i + 1, la secuencia N1N_1N 1 debe salir antes que la secuencia N2N_2N 2. Agregue cada fórmula de pequeña a grande, separe las fórmulas con punto y coma y envuelva después de cada 4 fórmulas.

Muestra de entrada:

7

Salida de muestra:

 

7 = 1 + 1 + 1 + 1 + 1 + 1 + 1; 7 = 1 + 1 + 1 + 1 + 1 + 2; 7 = 1 + 1 + 1 + 1 + 3; 7 = 1 + 1 + 1 + 2 + 2

7 = 1 + 1 + 1 + 4; 7 = 1 + 1 + 2 + 3; 7 = 1 + 1 + 5; 7 = 1 + 2 + 2 + 2

7 = 1 + 2 + 4; 7 = 1 + 3 + 3; 7 = 1 + 6; 7 = 2 + 2 + 3

7 = 2 + 5; 7 = 3 + 4; 7 = 7

 

​#include<cstdio>
int sum = 0,n,pointer=0,count = 0;//sum是和,n是待求的数,pointer 指示搜索位置 ,count用来计数, 
int A[30];//存放搜索结果 	//记录当前是第一个分解式子,便于输出 
void dfs(int x)//一层dfs就是对一个位置的搜索,如第一层dfs就是对第一个位置的数字进行搜索 
{			//所以进入下一层dfs进行搜索时,搜索数从x开始而不是从1开始 
	if(sum == n) //当sum == n时到了一个死胡同,返回上一层的dfs 
	{
		count++;
		printf("%d=",n);
		for(int i=0; i<pointer-1; i++)
		{
			printf("%d+",A[i]);
		}
		if(count%4==0||A[pointer-1]==n)
		{
			printf("%d\n",A[pointer-1]);
		}
		else
		{
			printf("%d;",A[pointer-1]);
		}
		return;
	}
	else if(sum>n) return;//当sum > n时到了一个死胡同,返回上一层的dfs 
	else//没到死胡同,不撞南墙不回头 
	{
		for(int i=x; i<=n; i++)//i从x开始是因为后面位置的数一定要大于前面的数 
		{
			A[pointer] = i;//用i来探索
			pointer++; 
			sum += i;
			dfs(i);//下一个位置从i开始探索 
			//如果程序进行到这说明当前层探索值为i时,包括下一层以后的所有层数都已经探索完毕
			//准备进入下一层循环
			//进入下一次循环前,要把当前sum回溯,指针指回当前位置 
			sum -= i;
			pointer--;
		}
	}
}
int main()
{
	scanf("%d",&n);
	dfs(1);
	return 0;	
} ​

 

Supongo que te gusta

Origin blog.csdn.net/yiwaite/article/details/104119274
Recomendado
Clasificación