洛谷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 }

 

posted @ 2017-06-01 19:25  third2333  阅读(242)  评论(0编辑  收藏  举报