Water filling algorithm