2016-09-02 14 views
5

Giả sử bạn được tặng A cam và B táo. Bạn muốn tạo một giỏ tổng số là N trái cây. Tổng số kết hợp táo và cam bạn có thể làm là bao nhiêu?
Giả sử A+B >= N.Tất cả sự kết hợp để tạo ra một giỏ trái cây từ cam và táo đã cho

Ví dụ:
Tôi có 6 quả cam và 6 quả táo và tôi muốn tạo giỏ với tổng số 9 quả.
Vì vậy, tôi có 4 kết hợp khác nhau:

3 apples 6 oranges 
4 apples 5 oranges 
5 apples 4 oranges 
6 apples 3 oranges 

Tôi muốn tạo ra một thuật toán đơn giản (và hiệu quả) để tính toán con số này.
Có cách nào toán/tổ hợp để tính số này trong O (1) không? Tôi không thể tìm được công thức chính xác cho việc này.

Trả lời

4

Câu trả lời này sẽ thể hiện cách tổng quát cách nhận đúng công thức đã đóng, thay vì cung cấp công thức "ở đây, hoạt động".

Để có được một công thức chặt chẽ, sử dụng Stars and Bars formulaInclusion Exclusion, bạn muốn tìm những số giải pháp để phương trình:

x1 + x2 = n 
s.t. 
(1) 0 <= x1 <= A 
(2) 0 <= x2 <= B 

Biểu thị:

W(0) = #solutions to the problem regardless of restrictions 
W(1) = #solutions to the problem with (1) is NOT correct (x1 > A) 
W(2) = #solutions to the problem with (2) is NOT correct (x2 > B) 
W(1,2) = #solutions to the problem with both (1,2) NOT correct (x1 > A and X2 > B) 

Từ nguyên tắc loại trừ bao gồm, câu trả lời cho vấn đề chúng tôi đã chính thức hóa ở trên là:

E = W(0) - (W(1) + W(2)) + W(1,2) 

Tất cả còn lại là cung cấp công thức cho W(...) và cho điều này, chúng tôi sẽ sử dụng Dấu sao và Thanh.

Sử dụng các phương trình mà không constraits và Định lý 2 quán bar và sao:

W(0) = Choose(N + 2 - 1, 2 - 1) = Choose(N + 1, 1) = N + 1 

Để tính toán W (1) và W (2), chúng tôi buộc x1/x2A+1 hoặc B+1, và sau đó đi như bình thường , và nhận được phương trình:

x1 + x2 = N - A - 1 
x1 + x2 = N - B - 1 

và số lượng các giải pháp được (một lần nữa sử dụng định lý 2):

W(1) = Choose(N - A - 1 + 2 - 1, 1) = Chose(N-A,1) = max{N-A,0} 
W(2) = (similarly) = max{N-B,0} 

Đối với W (1,2), chúng tôi đặt cả và tiếp tục và nhận được:

W(1,2) = Choose(N - A - 1 - B -1 + 2 - 1) = Choose(N-A-B-1,1) = max{N-A-B-1,0} 

Tóm nó tất cả cùng nhau đến công thức thức:

E = W(0) - (W(1) + W(2)) + W(1,2) = 
    = N + 1 - max{N-A,0} - max{N-B,0} + max{N-A-B-1,0} 

nào trong ví dụ của bạn là:

E = 9 + 1 - 3 - 3 + 0 = 4 
+0

Đây là một lời giải thích tuyệt vời và dường như hoạt động cho mọi ví dụ mà tôi đã thử. Bạn chỉ cần sửa chữa lỗi đánh máy trong công thức cuối cùng mà nó tính toán W (2) trên tối đa {N-A, 0} thay vì tối đa {N-B, 0}. –

+0

@BrianStephens Cảm ơn, đã làm điều đó khi bạn gõ nhận xét của bạn. – amit

+0

Cảm ơn bạn rất nhiều vì giải pháp chính xác và được giải thích tốt này. Tôi sẽ không nghĩ đến việc sử dụng Loại trừ Bao gồm. Đoán tôi cần phải làm mới trí nhớ của mình về tổ hợp. –

-3

Ok, xin lỗi, tôi đã (đường) quá nhanh.

Bạn biết luôn có ít nhất một giải pháp.

Bạn phải lấy ít nhất đủ trái cây của A sao cho với B, nó làm cho N. Bạn lấy tối đa A quả A. Nếu lớn hơn N, giới hạn là N. Vì vậy, câu trả lời phải là:

min(A, N) - max(0, N-B) + 1 
+0

No. Lấy ví dụ tổng số 4 quả. và bạn có 10 quả táo và 1 quả cam. Tổng số kết hợp là 2. Hoặc là 1 quả cam và 3 quả táo hoặc 0 quả cam và 4 quả táo. –

+0

Xin lỗi. Tôi nghĩ, bây giờ tôi đã làm đúng. –

+0

Để giải thích thêm một chút: min (A, N) là số lượng tối đa A bạn có thể thực hiện. max (0, N-B) là số lượng tối thiểu của A bạn cần. Sự khác biệt là do đó luôn luôn tích cực hoặc 0 (vì A + B> = N). Sự khác biệt cộng 1 là do đó giải pháp. –

-1

Nó phải là

ans = (A + B) - N + 1 
+0

No. Lấy ví dụ tổng số 4 quả. và bạn có 10 quả táo và 1 quả cam. Tổng số kết hợp là 2. Hoặc là 1 quả cam và 3 quả táo hoặc 0 quả cam và 4 quả táo. Đã sao chép nhận xét từ một câu trả lời khác. –

+0

Xin lỗi lỗi của tôi. –

+0

Tôi đã sao chép nhận xét của tác giả từ một câu trả lời khác không thỏa mãn như vậy. Câu trả lời của bạn sẽ không cung cấp đầu vào chính xác nếu '' 'A''' là 10' '' B''' là 1 và '' 'N''' = 4 ... Câu trả lời phải là' '' ans = 2' '' (hai cặp có thể được tạo ra (A, B) = (4.0) hoặc (A, B) = (3,1)) nhưng công thức của bạn sẽ cho '' 'ans = 8'''. –

2

phép nói rằng A_max là tối đa số A có thể được bao gồm trong sự kết hợp, và A_min là số nhỏ nhất của A mà phải được bao gồm trong bất kỳ sự kết hợp. Sau đó, sẽ có hai điều kiện đó phải được Satisified:

  1. A_max + B_min = N
  2. A_min + B_max = N

Vì chúng ta biết A_max (đó là min(NumOfA, N)), B_min có thể tìm thấy dễ dàng từ phương trình đầu tiên. Tương tự, người ta có thể tìm thấy A_min từ phương trình thứ hai. Do đó, danh sách các tổ hợp sẽ là:

A_max + B_min

(A_max-1) + (B_min+1)

(A_max-2) + (B_min+2)

...

(A_min) + (B_max)

Vì vậy, số lượng kết hợp như vậy sẽ (A_max - A_min + 1) hoặc là (B_max - B_min + 1)

Các vấn đề liên quan