ฉันต้องไปที่ธนาคารและถอนเงิน ฉันต้องถอนเงิน $ 30, $ 22 เพื่อจ่ายค่าเพื่อนร่วมห้องสำหรับอินเทอร์เน็ตและ $ 8 สำหรับค่าซักรีด เนื่องจากสิ่งเหล่านี้ไม่สามารถเปลี่ยนแปลงได้ฉันจึงต้อง $ 30 ของฉันแบ่งออกเป็นสองพาร์ติชันของสองขนาด นั่นหมายความว่าเมื่อผู้เบิกจ่ายถามฉันว่าฉันต้องการเงิน 30 เหรียญฉันจะต้องทำคำขอ ฉันสามารถบอกพวกเขาว่าฉันต้องการมันในยี่สิบ, fiver และห้าคน แต่ฉันต้องการที่จะทำให้คำขอของฉันง่ายที่สุดเท่าที่จะทำได้เพื่อหลีกเลี่ยงการทำซ้ำตัวเอง เพื่อให้การร้องขอของฉันง่ายขึ้นฉันสามารถขอให้เงินสดของฉันมียี่สิบคนและอย่างน้อย 2 คนเพราะ 8 มีนัยโดยนัย แต่ก็ดีกว่า แต่ฉันก็สามารถขอให้หนึ่งในตั๋วเงินที่ฉันได้รับเป็นเงินดอลลาร์หนึ่งใบ (ถ้าคุณ ไม่เชื่อเรื่องนี้แค่ลองทำเงิน 29 ดอลลาร์โดยไม่ทำ 8)
นั่นคือทั้งหมดที่ดีและสวยงาม แต่ฉันต้องทำการคำนวณนี้ทุกครั้งที่ฉันไปที่ธนาคารดังนั้นฉันคิดว่าฉันจะเขียนโปรแกรมเพื่อทำสิ่งนี้ (ให้คุณเขียนโปรแกรมเพื่อทำสิ่งนี้ให้ฉัน)
โปรแกรมหรือฟังก์ชั่นของคุณควรบันทึกรายการจำนวนเต็มซึ่งเป็นตัวแทนของการชำระเงินทั้งหมดที่ฉันต้องทำและชุดจำนวนเต็มที่แสดงถึงการเรียกเก็บเงินที่มีอยู่ในธนาคารและคุณจะต้องส่งออกรายการที่เล็กที่สุด ที่มีรายการของสกุลเงินที่สามารถแบ่งออกเป็นรายการชำระเงินได้อย่างหมดจด
กฎพิเศษ
คุณอาจสันนิษฐานว่ารายการค่าเงินจะมี
1
หรือคุณอาจเพิ่มเข้าไปในแต่ละรายการด้วยตนเองอินพุตบางตัวจะมีวิธีแก้ปัญหาขั้นต่ำหลายอย่าง ในกรณีเหล่านี้คุณสามารถส่งออกอย่างใดอย่างหนึ่ง
นี่คือcode-golfดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยไบต์น้อยจะดีขึ้น
กรณีทดสอบ
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)
คุณหมายถึงโดยไม่ทำ 8? หรือฉันเข้าใจผิด