Solusi dari masalah ini telah diberikan jutaan kali di Internet. Masalahnya disebut Masalah perubahan koin . Satu dapat menemukan solusi di http://rosettacode.org/wiki/Count_the_coins dan model matematika itu di http://jaqm.ro/issues/volume-5,issue-2/pdfs/patterson_harmel.pdf (atau perubahan koin Google masalah ).
Omong-omong, solusi Scala oleh Tsagadai, menarik. Contoh ini menghasilkan 1 atau 0. Sebagai efek samping, ia mencantumkan pada konsol semua solusi yang mungkin. Ini menampilkan solusi, tetapi gagal membuatnya dapat digunakan dengan cara apa pun.
Agar bermanfaat, kode harus mengembalikan a List[List[Int]]
untuk memungkinkan mendapatkan jumlah solusi (panjang daftar daftar), solusi "terbaik" (daftar terpendek), atau semua solusi yang mungkin.
Berikut ini sebuah contoh. Ini sangat tidak efisien, tetapi mudah dimengerti.
object Sum extends App {
def sumCombinations(total: Int, numbers: List[Int]): List[List[Int]] = {
def add(x: (Int, List[List[Int]]), y: (Int, List[List[Int]])): (Int, List[List[Int]]) = {
(x._1 + y._1, x._2 ::: y._2)
}
def sumCombinations(resultAcc: List[List[Int]], sumAcc: List[Int], total: Int, numbers: List[Int]): (Int, List[List[Int]]) = {
if (numbers.isEmpty || total < 0) {
(0, resultAcc)
} else if (total == 0) {
(1, sumAcc :: resultAcc)
} else {
add(sumCombinations(resultAcc, sumAcc, total, numbers.tail), sumCombinations(resultAcc, numbers.head :: sumAcc, total - numbers.head, numbers))
}
}
sumCombinations(Nil, Nil, total, numbers.sortWith(_ > _))._2
}
println(sumCombinations(15, List(1, 2, 5, 10)) mkString "\n")
}
Saat dijalankan, ini akan menampilkan:
List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2)
List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2)
List(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2)
List(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2)
List(1, 1, 1, 1, 1, 2, 2, 2, 2, 2)
List(1, 1, 1, 2, 2, 2, 2, 2, 2)
List(1, 2, 2, 2, 2, 2, 2, 2)
List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5)
List(1, 1, 1, 1, 1, 1, 1, 1, 2, 5)
List(1, 1, 1, 1, 1, 1, 2, 2, 5)
List(1, 1, 1, 1, 2, 2, 2, 5)
List(1, 1, 2, 2, 2, 2, 5)
List(2, 2, 2, 2, 2, 5)
List(1, 1, 1, 1, 1, 5, 5)
List(1, 1, 1, 2, 5, 5)
List(1, 2, 2, 5, 5)
List(5, 5, 5)
List(1, 1, 1, 1, 1, 10)
List(1, 1, 1, 2, 10)
List(1, 2, 2, 10)
List(5, 10)
The sumCombinations()
Fungsi dapat digunakan dengan sendirinya, dan hasilnya dapat dianalisis lebih lanjut untuk menampilkan "terbaik" solusi (daftar terpendek), atau jumlah solusi (jumlah daftar).
Perhatikan bahwa meskipun seperti ini, persyaratan mungkin tidak sepenuhnya dipenuhi. Mungkin terjadi bahwa urutan setiap daftar dalam solusi menjadi signifikan. Dalam kasus seperti itu, setiap daftar harus diduplikasi sebanyak waktu karena ada kombinasi unsur-unsurnya. Atau kita mungkin hanya tertarik pada kombinasi yang berbeda.
Sebagai contoh, kami dapat mempertimbangkan bahwa List(5, 10)
harus memberikan dua kombinasi: List(5, 10)
dan List(10, 5)
. Untuk List(5, 5, 5)
itu bisa memberikan tiga kombinasi atau satu saja, tergantung persyaratannya. Untuk bilangan bulat, tiga permutasi setara, tetapi jika kita berurusan dengan koin, seperti dalam "masalah perubahan koin", mereka tidak.
Juga tidak disebutkan dalam persyaratan adalah pertanyaan apakah masing-masing nomor (atau koin) dapat digunakan hanya sekali atau berkali-kali. Kita dapat (dan kita harus!) Menggeneralisasikan masalah ke daftar daftar kejadian masing-masing nomor. Ini diterjemahkan dalam kehidupan nyata menjadi "apa cara yang mungkin untuk menghasilkan sejumlah uang dengan satu set koin (dan bukan satu set nilai koin)". Masalah aslinya hanyalah kasus khusus dari kasus ini, di mana kami memiliki sebanyak mungkin setiap koin yang diperlukan untuk membuat jumlah total dengan setiap nilai koin tunggal.