UVa11137 Ingenuous Cubrency
原题传送:http://uva.onlinejudge.org/external/111/11137.html
递推,动态规划。
d[i][j]表示使用不超过i的 i 的整数的立方,累加和为 j 的方案数。
则有状态转移方程:
d[i][j] = d[i - 1][j] + d[i][j - i3]。
初始条件d[0][0] = 1;
View Code
1 #include <stdio.h> 2 #include <string.h> 3 typedef long long LL; 4 5 const int maxi = 21; 6 const int maxn = 10000; 7 8 LL d[maxi + 2][maxn + 5]; 9 10 void init() 11 { 12 memset(d, 0, sizeof d); 13 d[0][0] = 1; 14 for(int i = 1; i <= maxi; i ++) 15 { 16 for(int j = 0; j <= maxn; j ++) 17 { 18 if(j - i * i * i >= 0) 19 d[i][j] = d[i - 1][j] + d[i][j - i * i * i]; 20 else 21 d[i][j] = d[i - 1][j]; 22 } 23 } 24 } 25 26 int main() 27 { 28 init(); 29 int n; 30 while(scanf("%d", &n) == 1) 31 { 32 printf("%lld\n", d[maxi][n]); 33 } 34 return 0; 35 }