ooj 1664

poj上递推的题似乎比较少,而递推的题都比较难想。思路是从讨论区里学来的。

本题是很简单的递推。
①最少的盘子放了一个,这样每个盘子至少一个,n个盘子先放上n个,剩下的m-n个可以随便放
②最少的盘子没有放,这样剩下的n-1个盘子还是随便放m个
int f(int m,int n)
{ if(m<0)
   return 0;
  if(m==0||n==1)
   return 1;
  return f(m-n,n)+f(m,n-1);
}
#include <iostream>
#include <stdio.h>

using namespace std;

int func(int m,int n)
{
    if(m < 0)
        return 0;

    if(m == 0 || n == 1)
        return 1;
    else
        return func(m - n,n) + func(m,n - 1);
}

int main()
{
    int t,m,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&m,&n);
        printf("%d\n",func(m,n));
    }
    return 0;
}


你可能感兴趣的:(ooj 1664)