**Info**

This question is closed. Reopen it to edit or answer.

# how to do while loops with actual problems

1 view (last 30 days)

Show older comments

this is the most i have

n=1;

orders = [5 2 3 2.5 1 .8 1.2];

oil_supply=0;

oil_reserves = 15;

% number of full orders i can do and its remainder

while oil_supply < oil_reserves;

oil_supply = oil_supply + orders(n);

n=n+1;

Amount_left_in_Tank = oil_reserves - 15

end

fprintf('amount of orders completed %d\n',n)

fprintf('what left in the tank %d\n',Amount_left_in_Tank)

##### 1 Comment

John D'Errico
on 15 Jun 2019

Edited: John D'Errico
on 15 Jun 2019

### Answers (4)

James Browne
on 15 Jun 2019

Greetings,

I believe I have a solution to your problem. First, let us consider the nature of the problem...We have a certain amount of oil on hand, that we can use to fill customer orders. We also have a set of orders which request various amounts of oil and we want to fill as many full orders as we can with the reserves that we have on hand. We therefore first need to figure out how to determine the combination of orders that will give us the highest number of full orders satisfied while minimizing the amount of oil needed to satisfy all of the orders.

The most efficient solutions is then to first arrange the oil requests in the order of least amount requested to highest amount requested. We then add up the amount of oil that is needed to satisfy all orders from 1 to n. When the amount of oil needed to satisfy all orders exceeds or is equal to the amount of oil we have on hand, we stop. If the amount of oil needed to satisfy all orders is equal to the amount we have on hand for n orders, n is the number of full orders that we can fill, with the reserves on hand. If the amount of oil needed to satisfy n orders is greater than the reserves on hand, n-1 is the number of full orders that we can fill, with the reserves on hand.

This analysis can be executed with a while loop but it is easier (in my opinion) to execute with a for loop, as follows:

%State the amount of oil on hand

reserves = 15000;

%State the orders (requests for oil)

oilRequests = [5000 2000 3000 2500 1000 800 1200];

%Arrange oil requests in ascending order

oilRequests = sort(oilRequests);

%Determine the number of requests (n)

n = length(oilRequests);

%Determine the highest number of full orders that can be filled, given the

%reserves on hand

proceed = true;

totalRequested = 0;

nOrdersCanBeFilled = 0;

for i = 1:n

if ( proceed )

totalRequested = totalRequested + oilRequests(i);

if ( totalRequested > reserves )

nOrdersCanBeFilled = i - 1;

proceed = false;

end

if ( totalRequested == reserves )

nOrdersCanBeFilled = i;

proceed = false;

end

end

end

%Determine total amount of oil needed to fill maximum number of full orders

%this will verify that the amount of oil needed to fill the stated number

%of orders that can be filled will not exceed the oil reserves on hand

totalNeeded = sum(oilRequests(1:nOrdersCanBeFilled));

fprintf('The total number of full orders that can be filled, given the reserves of\n')

fprintf('is %i.\n',nOrdersCanBeFilled)

fprintf('Filling these orders will require %d of the given %d oil reserves on hand',totalNeeded,reserves)

Hope this answers your question~

##### 0 Comments

Ankit Kumar Mishra
on 15 Jun 2019

Edited: Ankit Kumar Mishra
on 15 Jun 2019

While loop is not the problem in this code.

There appears to be logical error in your solution. Your solution will not give the intended result as the variable

'Amount_left_in_Tank' will reduce to zero in first iteration of loop itself. This problem requires greedy approach. You need to sort your order array in ascending order so that small orders get completed first and number of orders fulfilled can be maximized.

Use this modified code instead.

n=1;

orders = [5 2 3 2.5 1 .8 1.2];

oil_supply=0;

oil_reserves = 15;

%finding length of array. col is no. of element in this array

[row,col]=size(orders);

%sort orders in ascending order so that small orders get fullfilled first so that number of orders is maximized

sorted_orders=sort(orders);

% number of full orders i can do and its remainder

while oil_supply < oil_reserves && n<=col;

oil_supply = oil_supply + sorted_orders(n);

%check if oil_supply does not exceed the reserves else break out of loop.

if oil_supply<=oil_reserves

%Amount left in tank is the same as the (initial oil reserve- the oil supplied till now)

Amount_left_in_Tank = oil_reserves - oil_supply;

n=n+1;

else

%break is used to terminate the loop and come out of it.

break;

end

end

% n is already initialized to one before so total no. of orders completed should be n-1

fprintf('amount of orders completed %d\n',(n-1))

fprintf('what left in the tank %d\n',Amount_left_in_Tank)

##### 0 Comments

### See Also

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!