POJ 1664 放苹果

题意:中文题就不说了……

 

解法:dp。想了半天也想不出来……果然智商被碾压……一定是装×的报应(wwww

考虑为dp[i][j]表示i个苹果放在j个盘子中的情况数。

当苹果数小于盘子数的时候,dp[i][j] = dp[i][i]

当苹果数大于盘子数的时候,dp[i][j] = dp[i][j - 1] + dp[i - j][j]

具体推断过程见http://blog.sina.com.cn/s/blog_6a706bf40100r1zf.html

也可以递归做……哼唧

 

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, m;
        cin >> n >> m;
        int dp[15][15] = {0};
        for(int i = 1; i <= n; i++)
            dp[i][1] = dp[i][0] = 1;
        for(int i = 1; i <= m; i++)
            dp[1][i] = dp[0][i] = 1;
        for(int i = 2; i <= n; i++)
        {
            for(int j = 2; j <= m; j++)
            {
                if(i < j)
                    dp[i][j] = dp[i][i];
                else
                {
                    dp[i][j] = dp[i][j - 1] + dp[i - j][j];
                }
            }
        }
        cout << dp[n][m] << endl;
    }
    return 0;
}

  

posted @ 2015-05-06 17:41  露儿大人  阅读(115)  评论(0编辑  收藏  举报