División de enteros (método de retroceso)

Descripción

¿Qué es una división entera? Por ejemplo, cuando n = 5, podemos obtener las siguientes divisiones (tenga en cuenta que m> = 5 en el ejemplo)

5 = 5 
   = 1 + 4 
   = 2 + 3 
   = 1 + 1 + 3 
   = 1 + 2 + 2 
   = 1+ 1+ 2
   = 1 + 1 + 1 + 1 + 1

Salida del número de todas las divisiones

Solución: Podemos ver que la clave de la división anterior es que el número de cada división no puede ser menor que el número anterior. 

Por lo tanto, podemos usar la búsqueda en profundidad para enumerar todos los casos y reducir las ramas para la salida.

#include<iostream>
using namespace std;
int Num[100],total=0,N; //total记录总数 Num数组记录划分的情况 
void print(int k)
{
	int i;
	cout<<N<<"="<<Num[1];
	for(i=2;i<=k;i++)
		cout<<"+"<<Num[i];
	cout<<"\n";
	total++;	
} 
void split(int n,int digit)   //n是需要拆分的数,dight表示需要拆分的位数 
{
	if(n<0)
		return ;
	else if(n==0&&digit>2)  //拆分完毕并且拆分的的位数大于1 
		print(digit-1);  //前面digit-1位全部拆分好了 
	else
	{
	for(int i=1;i<=n;i++)   //从1开始拆分 
		if(i>=Num[digit-1])    //拆分的数大于或等于前一个数 
		{
			Num[digit]=i;        //将这个数计入结果
		    split(n-i,digit+1);   //继续划分 n-i表示剩下的数 
		    Num[digit]=0;			//回溯 
		}
	}
}

int main(void)
{
	cin>>N;
	split(N,1);
	cout<<total<<endl;
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/a447332241/article/details/88030917
Recomendado
Clasificación