很典型的動(dòng)態(tài)規(guī)劃題
很好的算法:
f(m, n) = f(m-n, n) + f(m, n-1)
f(m, n): 把m個(gè)蘋(píng)果放到n個(gè)盤(pán)子中的方法數(shù)
f(m, n-1): 把m個(gè)蘋(píng)果放到n-1個(gè)盤(pán)子中的方法數(shù)(其中至少有一個(gè)空盤(pán)子)
f(m-n, n): 把m個(gè)蘋(píng)果放到n個(gè)盤(pán)子中,而且每個(gè)盤(pán)子中都有蘋(píng)果(先拿n個(gè)出來(lái),等m-n個(gè)放好了,然后每個(gè)盤(pán)子放一個(gè))
一定要牢記!!!
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <iomanip>
#include <stdlib.h>
using namespace std;

int PlaceApple(int m, int n)


{
if(m < 0)
return 0;
if(m == 0) //每個(gè)盤(pán)子一個(gè)
return 1;
if(n == 1) //只有一個(gè)盤(pán)子
return 1;
return PlaceApple(m - n, n) + PlaceApple(m, n - 1);
}

int main()


{
int num,m,n;
cin>>num;
while (num>0)

{
cin>>m>>n;
cout<<PlaceApple(m,n)<<endl;
num--;
}
}