เรากำลังใส่ลูกเป็นจำนวนคงที่ถังขยะ ถังขยะเหล่านี้เริ่มว่างเปล่า
Empty bin (a=4): 0 0 0 0
และหนึ่งโดยหนึ่งเราเพิ่มลูกไปที่ถังขยะ
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
เราต้องการวิธีที่รวดเร็วในการวนรอบสถานะที่เป็นไปได้ทั้งหมดที่ถังขยะใช้โดยไม่ซ้ำกันและไม่พลาดและเราไม่ต้องการแจกแจงถังขยะที่เป็นไปได้ทั้งหมด ดังนั้นเราจึงกำหนดดัชนีสำหรับถังขยะแต่ละชุดแทน
เรากำหนดดัชนีโดยการจัดเรียงการกำหนดค่าที่เป็นไปได้ในวิธีเฉพาะ:
- เรียงลำดับจากน้อยไปหามาก: ก่อน
0 0 0 0
อื่นจากนั้นกำหนดค่าที่เป็นไปได้โดยเพิ่ม 1 ลูกจากนั้น 2 และอื่น ๆ จากนั้นจัดเรียงภายในแต่ละผลรวมตามลำดับจากน้อยไปหามาก:
0 0 0 2 0 0 1 1 0 0 2 0 0 1 0 1 0 1 1 0 0 2 0 0 etc
ดัชนีจะถูกกำหนดจากน้อยไปมากในรายการนี้:
0 0 0 0 -> 1 0 0 0 1 -> 2 0 0 1 0 -> 3 0 1 0 0 -> 4 1 0 0 0 -> 5 0 0 0 2 -> 6 0 0 1 1 -> 7 0 0 2 0 -> 8 0 1 0 1 -> 9 0 1 1 0 -> 10 0 2 0 0 -> 11
กฎระเบียบ
สร้างฟังก์ชั่นหรือโปรแกรมที่รับรายการขนาดใด ๆ ที่มีจำนวนเต็มไม่เป็นลบและพิมพ์หรือส่งออกดัชนี คุณสามารถสมมติเป็นอย่างน้อย 2 ชนะรหัสที่สั้นที่สุด คุณสามารถใช้เอาต์พุต 0 ดัชนีหรือดัชนี 1 แต่ระบุสิ่งที่คุณใช้ หมายเหตุ: ตัวอย่างทั้งหมดที่นี่มีการจัดทำดัชนี 1
รหัสตัวอย่าง
ไม่เล่นกอล์ฟใน R:
nodetoindex <- function(node){
a <- length(node)
t <- sum(node)
if(t == 0) return(1)
index <- choose(t-1 + a, a)
while(sum(node) != 0){
x <- node[1]
sumrest <- sum(node)
if(x == 0){
node <- node[-1]
next
}
a <- length(node[-1])
index <- index + choose(sumrest + a, a) - choose(sumrest - x + a, a)
node <- node[-1]
}
return(index + 1)
}
กรณีทดสอบ
10 10 10 10 -> 130571
3 1 4 1 5 9 -> 424407
2 9 -> 69
0 0 0 -> 1
0 0 1 -> 2
0 0 0 0 0 0 -> 1
1 0 0 0 0 1 -> 23