0

My problem is that i have to create a program to hold a series of weights in containers (elements in a list). The max weight for each container is 20units. I have got this working as this:

containers = [0]
inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")

def findContainers(containers,inp):

for i in range(0,len(containers)):

if inp + containers <= 20:
return i

elif inp + containers[len(containers)-1] > 20:
return -1


def Allocator(containers,inp):

x = 0
while inp != 0:
i = findContainers(containers,inp)

if i == -1:
containers = containers + [inp]
i = len(containers) - 1

else:
containers = containers + inp

x = x + 1
print "Item ", x , ", Weight ", inp ,": Container ", (i + 1)
inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")


Allocator(containers,inp)


However, i need the weights to store themselves in the fullest container that can hold them.

E.g. If i had two contaainers:
1. 17
2. 18

and i wanted to add a weight of 2, whilst the first one could hold it, the weight will go on to the second container, and make it complete.

Thanks in advance for all help

4
Contributors
6
Replies
7
Views
6 Years
Discussion Span
Last Post by wazaa
0

Please repost with code tags (push the code button before you paste!). Then we can read your code much easier.

0

Oh sorry, the code is:

containers = [0]
inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")

def findContainers(containers,inp):
    
    for i in range(0,len(containers)):
        
        if inp + containers[i] <= 20:
            return i
        
        elif inp + containers[len(containers)-1] > 20:
            return -1


def Allocator(containers,inp):
    
    x = 0
    while inp != 0:
        i = findContainers(containers,inp)
        
        if i == -1:
            containers = containers + [inp]
            i = len(containers) - 1
            
        else:
            containers[i] = containers[i] + inp
            
        x = x + 1
        print "Item ", x , ", Weight ", inp ,": Container ", (i + 1)
        inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")
    print "Container weights: ", containers    



Allocator(containers,inp)

Basically, this version will give the the output:
"Container weights: [17, 15, 18, 9]" with the inputs 12, 15, 5, 10, 8, 9

I want it to output:
"Container weights: [20, 20, 19]" with the same input.

Thanks again

1

Oh sorry, the code is:

containers = [0]
inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")

def findContainers(containers,inp):
    
    for i in range(0,len(containers)):
        
        if inp + containers[i] <= 20:
            return i
        
        elif inp + containers[len(containers)-1] > 20:
            return -1


def Allocator(containers,inp):
    
    x = 0
    while inp != 0:
        i = findContainers(containers,inp)
        
        if i == -1:
            containers = containers + [inp]
            i = len(containers) - 1
            
        else:
            containers[i] = containers[i] + inp
            
        x = x + 1
        print "Item ", x , ", Weight ", inp ,": Container ", (i + 1)
        inp = input("Enter a weight, 20 or less, or enter 0 to quit: ")
    print "Container weights: ", containers    



Allocator(containers,inp)

Basically, this version will give the the output:
"Container weights: [17, 15, 18, 9]" with the inputs 12, 15, 5, 10, 8, 9

I want it to output:
"Container weights: [20, 20, 19]" with the same input.

Thanks again

Here is a way

>>> containers = [0]
>>> def find(w):
...  try:
...   w, i = max((x, i) for i, x in enumerate(containers) if x + w <= 20)
...   return i
...  except ValueError:
...   containers.append(0)
...   return len(containers) - 1
... 
>>> def process(seq):
...  for w in seq:
...   i = find(w)
...   containers[i] += w
... 
>>> process([12, 15, 5, 10, 8, 9])
>>> print containers
[20, 20, 19]

You should add a test to reject inputs > 20.

-1

I don't understand this, i think all i need is an IF statement in the findContainers function, can anyone do it this way, i have already tried with the max function, can't seem to get the wording right in the IF statement

1

Hey guys thanks for your help, jst solved it, all it was, was an IF statement with an AND included.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.