洛谷P2386 放苹果 数学 记忆化搜索
洛谷P2386 放苹果
数学 记忆化搜索
题意 将 n个球放入 k个 盒子中,允许有空盒子, 且 方案 1,1,5 和 5,1,1, 属于重复的
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std ; 10 11 int m,n,t,ans ; 12 int dp[21][21] ; 13 14 inline int dfs(int m,int n) 15 { 16 int ans = 0 ; 17 if(dp[m][n]) return dp[m][n] ; // 记忆化 18 if(m<=1||n<=1) ans = 1 ; // 如果苹果数小于 1 或者 盘子数小于 1 那么方案就只有一种 19 else if(m<n) ans = dfs(m,m) ; //苹果数 小于 盘子数 直接视 哪些多出来的 盘子放 0 然后不去管了 20 else ans = dfs( m-n,n ) + dfs( m,n-1 ) ; 21 dp[ m ][ n ] = ans ; 22 return ans ; 23 24 // 一种是 每个盘子先放一个 1苹果 ,也就是这一轮没有不放的, 25 // 第二种 就是当前盘子不放东西 放 0 个 26 } 27 28 int main() 29 { 30 scanf("%d",&t) ; 31 while(t--) 32 { 33 scanf("%d%d",&m,&n) ; 34 ans = dfs(m,n) ; 35 printf("%d\n",ans) ; 36 } 37 return 0 ; 38 }