poj1664放苹果

此方法是看了别人的题解的,利用像dp的思维做,f[m][n] = f[m][n-1]+f[m-n][n],

其中f[m][n]表示m个水果n个盘子时总的放的方法数,因为f[m][n]总可以

通过有空盘子或者没空盘子来放,f[m][n-1]表示有空盘子的情况,而

f[m-n][n]表示没有空盘子的情况,思路非常巧妙

 

 

 

#include <iostream>

using namespace std;

int ans;

int dfs(int m,int n)

{

       if(m==1)

              return 1;

       if(m<0)

              return 0;

       if(n==1)

              return 1;

       return dfs(m-n,n)+dfs(m,n-1);

}

int main()

{

       freopen("sum.in","r",stdin);

       freopen("sum.out","w",stdout);

       int t;

       cin>>t;

       while(t--)

       {

              int m,n;

              ans = 0;

              cin>>m>>n;

              cout<<dfs(m,n)<<endl;

       }

       return 0;

}

 

 

我开始是跟这个方法差不多,但是选择的函数变量选择有点问题,

导致总有些漏洞。。。

 

#include <iostream>

using namespace std;

int m,n,ans;

void dfs(int x,int y,int z)

{            //已有的个数,已用盘子的个数,计算

       if(x==m)

       {

              ans++;

              return;

       }

       if(y==n)

              return;

       for(int i=z;i<=m;i++)

              dfs(x+i,y+1,i);

}

int main()

{

       freopen("sum.in","r",stdin);

       freopen("sum.out","w",stdout);

       int t;

       cin>>t;

       while(t--)

       {

              ans = 0;

              cin>>m>>n;

              dfs(0,0,1);

              cout<<ans<<endl;

       }

       return 0;

}

你可能感兴趣的:(poj)