整数の除算(バックトラッキング方式)

説明

整数除算とは何ですか?たとえば、n = 5の場合、次の除算を取得できます(例ではm> = 5であることに注意してください)。

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

全部門数を出力

解決策:上記の除算の鍵は、各除算の数を前の数より少なくすることはできないということです。 

したがって、深さ優先探索を使用してすべてのケースを一覧表示し、出力の分岐を減らすことができます。

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

 

おすすめ

転載: blog.csdn.net/a447332241/article/details/88030917
おすすめ