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