メモ化再帰。 {{{#!highlight c++ #include #include using namespace std; int v[8] = {200, 100, 50, 20, 10, 5, 2, 1}; int dp[8][201]; int dfs(int index, int rem) { if (index == 8) { if (rem == 0) return 1; return 0; } if (dp[index][rem] >= 0) return dp[index][rem]; int sum = 0; for (int i = 0; i <= rem; i += v[index]) { sum += dfs(index+1, rem - i); } return dp[index][rem] = sum; } int main() { memset(dp, -1, sizeof(dp)); cout << dfs(0, 200) << endl; return 0; } }}}