POJ 1664 放苹果 (递推)

题目链接: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

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int dp[15][15];
 7 int main()
 8 {
 9     for(int i = 1 ; i <= 10 ; ++i)
10         dp[i][0] = 1;
11     for(int i = 1 ; i <= 10 ; ++i) {
12         for(int j = 1 ; j <= 10 ; ++j) {
13             if(j - i >= 0)
14                 dp[i][j] = dp[i - 1][j] + dp[i][j - i];
15             else
16                 dp[i][j] = dp[i - 1][j];
17         }
18     }
19     int t , n , m;
20     cin >> t;
21     while(t--) {
22         cin >> m >> n;
23         cout << dp[n][m] << endl;
24     }
25 }

 

posted @ 2016-05-30 20:39  Recoder  阅读(397)  评论(0编辑  收藏  举报