コイン問題 | 動的計画法 | Aizu Online Judge
コイン問題 | 動的計画法 | Aizu Online Judge
DPコースなるものを発見したので解いていこうと思う。
貪欲法でいける?と思ったが、コインの額面が半端なのでDPで解いていく。
int main() { int n, m; cin >> n >> m; int coins[25]; int dp[25][50005]; for (int i = 0; i < m; i++) cin >> coins[i]; for (int i = 0; i < 25; i++) fill(dp[i], dp[i] + 50005, 1000*1000); dp[0][0] = 0; for (int i = 0; i < m; i++) { for (int j = 0; j <= n; j++) { dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]); int k = j - coins[i]; if (k >= 0) { dp[i + 1][j] = min(dp[i + 1][j], dp[i][k] + 1); dp[i + 1][j] = min(dp[i + 1][j], dp[i + 1][k] + 1); } } } printf("%d\n", dp[m][n]); return 0; }