यह कुशल नहीं होगा, लेकिन आप इस
को polinomial समय
में एक सीधा गतिशील प्रोग्रामिंग एल्गोरिदम के साथ हल कर सकते हैं।
बहुपद की डिग्री आपके पास विभिन्न आकारों की संख्या पर निर्भर करेगी।
मैंने एक कार्यान्वयन शामिल किया है कि 3 अलग-अलग आकारों के लिए O(n1 * n2 * n3 * (C/s2) * (C/s3) * ((n1*s1 + n2*s2 + n3*s3)/C))
एक सुंदर क्रैपी स्थिरांक के साथ होगा। (यह आंकड़ा इस तथ्य की सौजन्य है कि हम उपलब्धता के विशिष्ट पैटर्न की संख्या O(n1 * n2 * n3)
है और प्रत्येक के लिए हम O((C/s2) * (C/s3))
उत्पन्न करने के लिए अगले डिब्बे को संभव बनाने के लिए उत्पन्न करते हैं, जिनमें से प्रत्येक के लिए हमें डिब्बे के सेट के साथ काम करना होता है जिसका आकार O((n1*s1 + n2*s2 + n3*s3)/C))
है। कई नियमित अनुकूलन इस कार्यक्रम को बड़े पैमाने पर बढ़ा सकते हैं।)
#! /usr/bin/python
import heapq
def min_bins(bin_size, sizes, counts):
available = zip(sizes, counts)
available.sort(reverse=True)
seen = set([])
upcoming = [(0, available, [])]
while 0 < len(upcoming):
(n, available, bins) = heapq.heappop(upcoming)
for (bin, left) in bin_packing_and_left(bin_size, available):
new_bins = bins + [bin]
if 0 == len(left):
return new_bins
elif left not in seen:
heapq.heappush(upcoming, (n+1, left, new_bins))
seen.add(left)
def bin_packing_and_left(bin_size, available, top=True):
if 0 == len(available):
yield ((),())
else:
(size, count) = available[0]
available = available[1:]
for (bin, left, used) in bin_packing_and_left_size(bin_size, available):
can_use = (bin_size - used)/size
if count <= can_use:
yield(((size, count),) + bin, left)
elif 0 < can_use:
yield(((size, can_use),) + bin,
((size, count - can_use),) + left)
else:
yield(bin, ((size, count),) + left)
def bin_packing_and_left_size(bin_size, available):
if 0 == len(available):
yield ((),(), 0)
else:
(size, count) = available[0]
available = available[1:]
for (bin, left, used) in bin_packing_and_left_size(bin_size, available):
for i in range(1 + min(count, (bin_size - used)/size)):
if count == i:
yield(((size, count),) + bin, left, used + size * count)
elif 0 < i:
yield(((size, i),) + bin,
((size, count - i),) + left,
used + size * i)
else:
yield(bin, ((size, count),) + left, used)
answer = min_bins(23, (2, 3, 5), (20, 30, 40))
print len(answer)
print answer
के रूप में लिखा जा सकता है इष्टतम मूल्य प्रश्न क्या है? –
किस वर्ग के लिए होमवर्क वास्तव में? –
@ हेनक: यह वैसे भी होमवर्क नहीं है, मैंने 6 साल पहले कॉलेज छोड़ा था। यह एक बेवकूफ सवाल हो सकता है लेकिन मैं अपने आप पर उप-समस्या नहीं कर सका। –