题目大意:给出两个整数M,N 在1~M的范围里选出N个数,条件是第i个数必须大于等于第i-1个数的两倍, 求总共能选出的方案数.
设dp[i][j]为1~i选择j个数出来的方案数,那么dp[k][j + 1] += dp[i][j] (2 * i<= k <= M)
#include <cstdio>
#include <memory.h>
using namespace std;
const int MAX = 2001;
long long dp[MAX][11];
void init(){
for(int i = 1; i < MAX; ++i){
dp[i][1] = 1;
for(int j = 1; j <= 10; ++j){
for(int k = 2 * i; k < MAX; ++k){
dp[k][j + 1] += dp[i][j];
}
}
}
}
int main(int argc, char const *argv[]){
int C, caseno = 1;
init();
scanf("%d", &C);
while(C--){
int n, m;
scanf("%d%d", &n, &m);
long long ans = 0;
for(int i = 1; i <= m; ++i){
ans += dp[i][n];
}
printf("Case %d: n = %d, m = %d, # lists = %lld\n", caseno++, n, m, ans);
}
return 0;
}