Ini adalah salah satu materi yang ada di buku Pemrograman Kompetitif. Buku ini bisa di download di https://tlx.toki.id/courses/competitive/chapters/07/lessons/A. Seharusnya penjelasannya diketik ulang , tapi maaf belum sempat...
Dalam buku dijelaskan konsep dan Pseudocode dari soal. Keduanya diterjemahkan dalam bahasa Python versi saya.
Soalnya seperti ini:
Diberikan M jenis koin, masing-masing jenis bernilai a₁,a₂, ....aₘ rupiah. Asumsikan banyaknya koin yang ada tak terbatas. Tentukan banyaknya koin paling sedikit untuk membayar tepat sebesar N rupiah!
Solusinya bisa diselesaikan dalam dua cara: Bottom up dan Top down.
1. Bottom-up: (ubah variabel M dan N untuk mengubah input)
- def solve(a, N):
- f = [0] * (N + 1)
- for x in range(1, N + 1):
- best = float('inf')
- for k in range(len(a)):
- if a[k] <= x:
- best = min(best, f[x - a[k]] + 1)
- f[x] = best
- return f[-1]
- def main():
- M = 1, 6, 10
- N = 12
- print(solve(M, N))
- if __name__ == '__main__':
- main()
2. Top-down:
- def solve(x):
- if x == 0: return 0
- best = float('inf')
- for k in range(len(M)):
- if M[k] <= x:
- best = min(best, solve(x - M[k]) + 1)
- return best
- def main():
- global M
- M = 1000, 2000, 5000
- N = 12000
- print(solve(N))
- if __name__ == '__main__':
- main()
Tidak ada komentar:
Posting Komentar