1. 程式人生 > >演算法——分蘋果問題和算24問題(遞迴演算法)

演算法——分蘋果問題和算24問題(遞迴演算法)

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