Division d'entiers (méthode de retour arrière)

La description

Qu'est-ce qu'une division entière? Par exemple, lorsque n = 5, nous pouvons obtenir les divisions suivantes (notez que m> = 5 dans l'exemple)

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

Sortie du nombre de toutes les divisions

Solution: nous pouvons voir que la clé de la division ci-dessus est que le numéro de chaque division ne peut pas être inférieur au nombre précédent 

Par conséquent, nous pouvons utiliser la recherche en profondeur d'abord pour répertorier tous les cas et réduire les branches pour la sortie.

#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;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/a447332241/article/details/88030917
conseillé
Classement