题目链接:http://poj.org/problem?id=2193
题目思路:转移方程:dp[i][j]=sum[i-1][j/2]; sum[i][j]=sum[i][j-1]+dp[i][j];其中dp[i][j]记录的是前i个数结尾是j的个数,而sum是小于等于j;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 110
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int t,n,m;
__int64 dp[12][2010],sum[12][2010];
int main()
{
int i,j,k,count=1;
//dp[0][0]=1;
for(i=1;i<=10;i++)
for(j=1;j<=2000;j++)
{
if(i==1)
dp[i][j]=1;
else
dp[i][j]=sum[i-1][j/2];
sum[i][j]=sum[i][j-1]+dp[i][j];
}
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
__int64 ans=0;
printf("Case %d: n = %d, m = %d, # lists = %I64d\n",count++,n,m,sum[n][m]);
}
}