Chúng tôi đang đặt quả bóng vào một số cố định một thùng. Những thùng rác bắt đầu trống rỗng.
Empty bin (a=4): 0 0 0 0
Và từng người một chúng tôi thêm bóng vào thùng.
0 0 0 1 or
0 0 1 0 or
0 1 0 0 or
1 0 0 0
Chúng tôi cần một cách nhanh chóng để lặp lại tất cả các trạng thái có thể có của các thùng, không trùng lặp và không bỏ sót bất kỳ và chúng tôi không muốn liệt kê tất cả các thùng có thể. Vì vậy, thay vào đó chúng ta gán cho mỗi cấu hình bin một chỉ mục.
Chúng tôi chỉ định chỉ mục bằng cách sắp xếp các cấu hình có thể theo một cách cụ thể:
- Sắp xếp tăng dần theo tổng: vì vậy trước tiên
0 0 0 0
, sau đó các cấu hình có thể có thêm 1 bóng, sau đó 2, v.v. Sau đó sắp xếp trong mỗi tổng theo thứ tự tăng dần, từ thùng đầu tiên đến thùng cuối cùng:
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
Chỉ mục sau đó được chỉ định tăng dần qua danh sách này:
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
Quy tắc
Tạo một hàm hoặc chương trình lấy danh sách có kích thước bất kỳ với các số nguyên không âm và in hoặc xuất chỉ mục của nó. Bạn có thể giả định một để có ít nhất 2. thắng đang Shortest. Bạn có thể sử dụng đầu ra 0 chỉ mục hoặc 1 chỉ mục, nhưng chỉ định bạn sử dụng. NB: tất cả các ví dụ ở đây là 1 chỉ mục.
Mã ví dụ
Không chơi gôn, trong 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)
}
Các trường hợp thử nghiệm
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