演算法——分蘋果問題和算24問題(遞迴演算法)
using namespace std;
/*分為n>m和n<m兩種情況。當n>m時,一定有盤子為空,此時f(m,n)=f(m,m)
當n<=m時,分為有盤子為空時(至少有一個盤子為空):f(m,n-1),沒有盤子為空(每個盤子至少放了一個蘋果):f(m-n,n)
"*/
int f(int m,int n)
{
if(n>m)
return f(m,m);
if(m==0) //如果沒有蘋果,那麼只有一種情況就是所有的盤子都為空
return 1;
if(n==0) //如果沒有盤子,則不存在這樣的方法來放蘋果
return 0;
return f(m,n-1)+f(m-n,n);
}
int main()
{
int m,n,t; //t為輸入幾組m,n
cin>>t;
while(t--)
{
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}
//算24演算法
#define EPS le-6
double a[5];
int iszero(double x)
{
return fabs(x) <= EPS;
}
void count24(double a[],int n)
{
if(n==1)
{
iszero(a[0]-24)
return true;
else
return false;
}
double b[5];
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++) //雙重迴圈枚舉出所有的兩個數
{
int m=0;
for(int k=0;k<n-2;k++) //把剩下的三個數放到b中
if(a[k]!=a[i]&&a[k]=a[j])
b[m++]=a[k];
b[m]=a[i]+a[j]; //把選出來的兩個數操作後的值放在b陣列中,然後對這n-1個數(m+1)個數進行同樣的操作
if(count24(b,m+1))
return true;
b[m]=a[i]-a[j]
if(count2(b,m+1))
return true;
b[m]=a[j]-a[i];
if(count24(b,m+1))
return true;
b[m]=a[i]*a[j];
if(count24(b,m+1))
return true;
if(iszero(a[j])) //當a[j]不為零的時候才能除
{
b[m]=a[i]/a[j];
if(count24(b,m+1))
return true;
}
if(iszero(a[i])) //當a[i]不為零的時候才能做除法
{
b[m]=a[j]/a[i];
if(count24(b,m+1))
return true;
}
}
return false;
}