帶分數dfs+剪枝優化
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
int num=1;
int sum=0;
int A=1,B=1,C=1; // num=a+b/c ,a,b,c所對應的長度
int abc[11];//儲存a,b,c的值
int is[10]={0};
int a=0,b=0,c=0;
int power(int x,int y)
{
int pow =1;
for(int i=0;i<y;i++)
pow=pow*x;
return pow;
}
int cal(char n)
{
int sum=0;
if(n==‘C‘)
for(int i=1;i<=C;i++)
sum+=abc[i]*power(10,C-i);
if(n==‘B‘)
for(int i=C+1;i<=C+B;i++)
sum+=abc[i]*power(10,C+B-i);
if(n==‘A‘)
for(int i=C+B+1;i<=9;i++)
sum+=abc[i]*power(10,9-i);
return sum;
}
void f(int n) //從c-b-a根據位數取值放到abc數組保存,判斷
{
if(n>C+B)
{
c=cal(‘C‘);
b=cal(‘B‘);
//剪枝2 b必須大於c
if(b<c) return ;
//剪枝3 b/c必須為整數
if(b%c!=0) return ;
int s=b/c;
//剪枝4,b/c必須小於num
if(s>num) return ;
}
if(n==10) //取值完畢
{
a=cal(‘A‘);
if(a+b/c==num )
{
/* printf("%d = ",num);
for(int i=1;i<=A;i++)
printf("%d",abc[B+C+i]);
printf("+");
for(int i=1;i<=B;i++)
printf("%d",abc[C+i]);
printf("/");
for(int i=1;i<=C;i++)
printf("%d",abc[i]);
printf("\n");*/
sum++;
}
return ;
}
for(int i=1;i<=9;i++)
{
if(is[i]==0)
{
is[i]=1;
abc[n]=i;//按位儲存c的值
f(n+1);
abc[n]=0;
is[i]=0;
}
}
}
int main()
{
cin>>num;
/*剪枝一*/
for(C=1;C<=4;C++) //分母長度最多為4位
for(B=C;B<=7,B+C<=8;B++) //分子位數不低於父母位數且要保證A的長度
{
A=9-B-C;
f(1);
}
cout<<sum<<endl;
printf("Time used = %.2f",(double)clock()/CLOCKS_PER_SEC);// 註意題目時間
return 0;
}
帶分數dfs+剪枝優化