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;
}

浙公网安备 33010602011771号