Saya perlu pergi ke bank dan menarik uang. Saya perlu menarik $ 30, $ 22 untuk membayar teman sekamar saya untuk internet dan $ 8 untuk binatu. Karena tak satu pun dari ini dapat melakukan perubahan, saya perlu $ 30 saya untuk dipecah menjadi dua partisi dari dua ukuran. Itu berarti ketika teller bertanya kepada saya bagaimana saya ingin $ 30 saya, saya harus membuat permintaan. Saya bisa memberi tahu mereka bahwa saya menginginkannya dalam dua puluh, lima, dan lima. Tetapi saya ingin membuat permintaan saya sesederhana mungkin untuk menghindari keharusan mengulang sendiri. Untuk membuat permintaan saya lebih sederhana, saya bisa meminta uang tunai saya mengandung dua puluh dan setidaknya 2 karena 8 tersirat dari total, tetapi lebih baik lagi saya bisa meminta agar salah satu tagihan yang saya terima menjadi tagihan satu dolar (jika Anda tidak yakin dengan hal ini hanya mencoba menghasilkan 29 dolar tanpa menghasilkan 8).
Jadi itu semua bagus dan bagus tapi saya perlu melakukan perhitungan ini setiap kali saya pergi ke bank jadi saya pikir saya akan menulis sebuah program untuk melakukan ini (apakah Anda menulis sebuah program untuk melakukan ini untuk saya).
Program atau fungsi Anda harus mengambil daftar bilangan bulat yang mewakili semua pembayaran yang perlu saya lakukan dan satu set bilangan bulat yang mewakili denominasi tagihan yang tersedia di bank, dan Anda harus menampilkan daftar denominasi terkecil sehingga setiap cara untuk membuat total itu termasuk bahwa daftar denominasi dapat dengan bersih dibagi ke dalam daftar pembayaran.
Aturan ekstra
Anda dapat mengasumsikan bahwa daftar denominasi akan selalu berisi
1
atau Anda dapat menambahkannya sendiri ke setiap daftar.Beberapa input akan memiliki beberapa solusi minimal. Dalam kasus ini Anda dapat menampilkan salah satu.
Ini adalah kode-golf sehingga jawaban akan dinilai dalam byte dengan lebih sedikit byte lebih baik.
Uji Kasus
Payments, denominations -> requests
{22,8} {1,2,5,10,20,50} -> {1} or {2}
{2,1,2} {1,5} -> {1}
{20,10} {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2} -> {1,1,1}
{20,6} {1,4,5} -> {1}
{2,6} {1,2,7} -> {2}
{22, 11} {1, 3, 30, 50} -> {1, 3}
{44, 22} {1, 3, 30, 50} -> {1, 3, 3, 30}
{2,6} {1,2,7} -> {2}
.(If you are not convinced of this just try to make 29 dollars without making 9)
Maksudmu tanpa membuat 8? Atau apakah saya salah pahamJawaban:
JavaScript (ES6),
485476 byteBaiklah ... ini monster. :-(
Tapi itu adalah monster yang cukup cepat yang menyelesaikan semua test case secara instan.
Saya mungkin mencoba bermain golf lebih lanjut nanti, tetapi saya sudah menghabiskan terlalu banyak waktu untuk itu.
Uji kasus
Tampilkan cuplikan kode
Bagaimana?
NB: Ini tidak cocok dengan versi saat ini lagi, tetapi jauh lebih mudah dibaca dengan cara itu.
sumber
&&
to&
dan the||
to|
?a || b
akan mengevaluasib
hanya jikaa
palsu, sementaraa | b
tanpa syarat akan melakukan bitwise ATAU antaraa
danb
.Python 2 ,
456455 byteSangat, sangat, sangat lambat !!!! Harus bekerja dengan benar pada semua contoh input yang diberikan waktu yang cukup
Sunting: Disimpan 1 byte berkat @Jonathan Frech
Cobalah online!
Penjelasan
sumber
input()
adalah satu byte lebih pendek .