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 }