Masalah perubahan koin didokumentasikan dengan sangat baik. Diberikan pasokan koin denominasi tanpa batas x_1
kepada x_m
Anda, Anda perlu menemukan jumlah kombinasi yang berjumlah hingga y
. Misalnya, diberikan x = {1,2,3}
dan y = 4
kami memiliki empat kombinasi:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
pengantar
Ada beberapa variasi masalah perubahan koin. Dalam variasi ini kami memiliki dua batasan tambahan:
- Setiap denominasi harus digunakan setidaknya satu kali.
- Jumlah koin yang pasti harus digunakan secara total.
Misalnya, diberikan x = {1,2,3}
, y = 36
dan di n = 15
mana n
jumlah total koin yang harus digunakan, kami mendapatkan empat kombinasi:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1 yang, 7 dua, 7 bertiga){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2 orang, 5 pasangan, 8 bertiga){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3 yang, 3 dua, 9 bertiga){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4 orang, 1 dua, 10 bertiga)
Tantangan
Tantangannya adalah untuk menulis fungsi enumerate
dalam bahasa pilihan Anda yang menyebutkan semua kombinasi seperti dijelaskan di atas:
- Daftar denominasi. Sebagai contoh
{1,5,10,25}
. Anda dapat menggunakan daftar atau array. - Integer non-negatif
y
yang menunjukkan jumlah setiap kombinasi. - Bilangan bulat non-negatif
n
yang menunjukkan jumlah total koin.
Urutan argumen tidak masalah. Fungsi pointfree diizinkan.
Output dari enumerate
fungsi harus berupa daftar kombinasi. Setiap kombinasi harus unik dan harus berupa daftar n
bilangan bulat yang ditambahkan y
. Setiap denominasi harus muncul setidaknya sekali dalam setiap kombinasi dan tidak ada kombinasi yang harus hilang. Urutan bilangan bulat dan kombinasinya tidak masalah. Anda dapat menggunakan daftar atau array untuk output.
Ingatlah kasus tepi berikut:
- Jika keduanya
y
dann
nol dan daftar denominasi kosong maka output adalah daftar satu kombinasi, kombinasi kosong (yaitu{{}}
). - Kalau tidak, jika
y
nol,n
adalah nol atau daftar denominasi kosong maka outputnya adalah daftar kombinasi nol (yaitu{}
). - Lebih umum, jika
y
lebih kecil dari jumlah denominasi ataun
kurang dari jumlah denominasi maka hasilnya adalah daftar kombinasi nol.
Penilaian akan didasarkan pada ukuran seluruh program dalam byte. Perhatikan bahwa ini termasuk enumerate
fungsi, fungsi pembantu, pernyataan impor, dll. Ini tidak termasuk kasus uji.
sumber
y
kurang dari jumlah denominasi maka pada beberapa titik dalam solusi rekursif Anda, Anda akan mencapai kasus dasar di mana daftar denominasi kosong. Oleh karena itu, jawabannya adalah{}
(yaitu tidak ada solusi yang ditemukan). Jikan
kurang dari jumlah denominasi maka pada akhirnya Anda akan mencapai kasus dasar di manan = 0
tetapiy != 0
. Karenanya, jawabannya akan kembali{}
.Jawaban:
05AB1E, 20 byte
Input adalah dalam urutan:
list of values
,nr of coins
,sum to reach
.Penjelasan singkatnya
final length - length of unique coin list
Cobalah online
Kompiler online tidak dapat menangani sejumlah besar koin.
sumber
MATL , 22 byte
Input order adalah: array denominasi, jumlah koin yang diambil (
n
), jumlah yang diinginkan (y
).Setiap kombinasi ditampilkan pada garis yang berbeda. Output kosong ditampilkan sebagai string kosong (jadi tidak ada).
Cobalah online!
Kode kehabisan memori dalam kompiler online untuk contoh dalam tantangan, tetapi bekerja offline dengan komputer standar yang cukup modern:
Penjelasan
sumber
Python 3,
120106 byteFungsi anonim yang mengambil input dari tupel denominasi formulir
(x_1, x_2, x_3 ... , x_k)
, nilai target, dan sejumlah koin melalui argumen, dan mengembalikan daftar tupel formulir[(solution_1), (solution_2), (solution_3), ... (solution_k)]
.Bagaimana itu bekerja
Itertools
'scombinations_with_replacement
fungsi digunakan untuk menghasilkan semual-len(d)
kombinasi, dengan penggantian, dari denominasi. Dengan menambahkand
ke masing-masing kombinasi ini, dijamin bahwa setiap denominasi muncul setidaknya satu kali, dan bahwa kombinasi baru memiliki panjangl
. Jika elemen-elemen dari kombinasi berjumlaht
, kombinasi ditambahkan ke daftar kembali sebagai tupel.Cobalah di Ideone
Metode alternatif untuk 108 byte
Fungsi anonim yang mengambil input dari tupel denominasi formulir
(x_1, x_2, x_3 ... , x_k)
, nilai target, dan sejumlah koin melalui argumen, dan mengembalikan satu set tupel formulir{(solution_1), (solution_2), (solution_3), ... (solution_k)}
.Bagaimana cara kerjanya (versi lain)
Ini menggunakan
product
fungsi dariitertools
untuk menghasilkan semual-len(d)
pengaturan denominasi. Dengan menambahkand
ke masing-masing kombinasi ini, dijamin bahwa setiap denominasi muncul setidaknya satu kali, dan bahwa kombinasi baru memiliki panjangl
. Jika elemen-elemen dari kombinasi berjumlaht
, kombinasi diurutkan, dikonversi dari daftar ke tuple, dan ditambahkan ke tupel kembali. Akhirnya, panggilanset
menghapus duplikat apa pun.Cobalah di Ideone (versi lain)
sumber
JavaScript (ES6), 135 byte
sumber