第五题:整数划分 dp[m] += dp[m - i](i = 1,2,3) #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; #define INF 100000000 #define MAXN 200 long long dp[2][MAXN + 1]; int main() { int A, B, t; int now , pre; while(~scanf("%d%d%d", &A, &B, &t)) { int n = t / 15; B += n / 2; n = (n + 1) / 2; int m = B - A + 1; if(n == 0) { if(A>B)printf("1\n"); else printf("0\n"); continue; } memset(dp, 0, sizeof(dp)); now = 0; pre = 1; dp[now][1] = dp[now][2] = dp[now][3] = 1; for(int i = 2; i <= n; ++i) { now = !now; pre = !pre; for(int j = MAXN; j >= 0; --j) { dp[now][j + 1] += dp[pre][j]; dp[now][j + 2] += dp[pre][j]; dp[now][j + 3] += dp[pre][j]; } memset(dp[pre], 0, sizeof(dp[pre])); } long long ans = 0; for(int i = (m > n) ? m : n; i <= MAXN; ++i ) ans += dp[now][i]; printf("%lld\n", ans); } return 0; }