题意 : 给你两个数N和M,让你从1到M中找N个数组成一个序列,这个序列需要满足的条件是后一个数要大于前一个数的两倍,问这样的序列有多少,输出。
思路 : dp[i][j]代表着长度为 i 的序列,最后一位是 j ,所以初始化的时候dp[1][ i ] = 1 ;dp[i][j] = sum(dp[i][k])(k < j/2) ;
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 5 using namespace std ; 6 7 __int64 dp[11][2001]; 8 9 void chart() 10 { 11 memset(dp,0,sizeof(dp)); 12 for(int i = 1 ; i <= 2000 ; i++) 13 dp[1][i] = 1 ; 14 for(int i = 2 ; i <= 10 ; i++) 15 for(int j = 1<<(i-1) ; j <= 2000 ; j++) 16 for(int k = 1 ; k <= j/2 ; k++) 17 dp[i][j] += dp[i-1][k]; 18 } 19 int main() 20 { 21 int t; 22 scanf("%d",&t); 23 int n,m ,cas = 1; 24 chart(); 25 while(t--) 26 { 27 __int64 ans = 0 ; 28 scanf("%d%d",&n,&m); 29 for(int i = 1 ; i <= m ; i++) 30 ans += dp[n][i]; 31 printf("Case %d: n = %d, m = %d, # lists = %I64d\n",cas++,n,m,ans); 32 } 33 return 0; 34 }