题目链接:http://poj.org/problem?id=1664

dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] 递推而来。

当盘子的个数大于等于苹果的个数:

  dp[i - 1][j] :i - 1个盘子放j个苹果,说明i个盘子里最少有一个盘子是空的

  dp[i][j - i] :i个盘子都放了苹果,说明有j - i个苹果是随便放置的

否则:

  dp[i][j] = dp[i - 1][j]

然后没有苹果的盘子的方案为1,即dp[i][0] = 1

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[][];
int main()
{
for(int i = ; i <= ; ++i)
dp[i][] = ;
for(int i = ; i <= ; ++i) {
for(int j = ; j <= ; ++j) {
if(j - i >= )
dp[i][j] = dp[i - ][j] + dp[i][j - i];
else
dp[i][j] = dp[i - ][j];
}
}
int t , n , m;
cin >> t;
while(t--) {
cin >> m >> n;
cout << dp[n][m] << endl;
}
}
05-02 17:51