macro_rules !input {(source =$s :expr ,$($r :tt ) *) =>{let mut iter =$s .split_whitespace () ;let mut next =||{iter .next () .unwrap () } ;input_inner !{next ,$($r ) *} } ;($($r :tt ) *) =>{let stdin =std ::io ::stdin () ;let mut bytes =std ::io ::Read ::bytes (std ::io ::BufReader ::new (stdin .lock () ) ) ;let mut next =move ||->String {bytes .by_ref () .map (|r |r .unwrap () as char ) .skip_while (|c |c .is_whitespace () ) .take_while (|c |!c .is_whitespace () ) .collect () } ;input_inner !{next ,$($r ) *} } ;}
macro_rules !input_inner {($next :expr ) =>{} ;($next :expr ,) =>{} ;($next :expr ,$var :ident :$t :tt $($r :tt ) *) =>{let $var =read_value !($next ,$t ) ;input_inner !{$next $($r ) *} } ;}
macro_rules !read_value {($next :expr ,($($t :tt ) ,*) ) =>{($(read_value !($next ,$t ) ) ,*) } ;($next :expr ,[$t :tt ;$len :expr ] ) =>{(0 ..$len ) .map (|_ |read_value !($next ,$t ) ) .collect ::<Vec <_ >>() } ;($next :expr ,chars ) =>{read_value !($next ,String ) .chars () .collect ::<Vec <char >>() } ;($next :expr ,usize1 ) =>{read_value !($next ,usize ) -1 } ;($next :expr ,$t :ty ) =>{$next () .parse ::<$t >() .expect ("Parse error" ) } ;}

fn main() {
   input! {
      a: usize,
      b: usize,
      c: usize,
      d: usize,
      e: usize,
      f: usize,
   }

   let mut set = std::collections::BTreeSet::new();
   for i in (0..f).take_while(|i| c * i <= f) {
      for j in (0..f).take_while(|j| c * i + d * j <= f) {
         set.insert(c * i + d * j);
      }
   }
   let cl: Vec<_> = set.iter().map(|&x| x).collect();

   let mut ans = (0, 1);
   for i in (0..f).take_while(|i| 100 * a * i <= f) {
      for j in (0..f).take_while(|j| 100 * (a * i + b * j) <= f) {
         if i | j == 0 {
            continue;
         }
         let df = f - 100 * (a * i + b * j);
         let mn = std::cmp::min((a * i + b * j) * e, df);
         let k = cl.upper_bound(&mn);
         let x = cl[k-1];
         if check(ans, (x, f - df + x)) {
            ans = (x, f - df + x);
         }
      }
   }
   if ans.0 == 0 {
      println!("{} 0", 100*a);
   } else {
      println!("{} {}", ans.1, ans.0);
   }
}

/// Equivalent to std::lowerbound and std::upperbound in c++
pub trait BinarySearch<T> {
   fn lower_bound(&self, x: &T) -> usize;
   fn upper_bound(&self, x: &T) -> usize;
}
#[allow(dead_code)]
impl<T: Ord> BinarySearch<T> for [T] {
   fn lower_bound(&self, x: &T) -> usize {
      let mut low = 0;
      let mut high = self.len();
      while low != high {
         let mid = (low + high) / 2;
         match self[mid].cmp(x) {
            std::cmp::Ordering::Less => {
               low = mid + 1;
            }
            std::cmp::Ordering::Equal | std::cmp::Ordering::Greater => {
               high = mid;
            }
         }
      }
      low
   }
   fn upper_bound(&self, x: &T) -> usize {
      let mut low = 0;
      let mut high = self.len();
      while low != high {
         let mid = (low + high) / 2;
         match self[mid].cmp(x) {
            std::cmp::Ordering::Less | std::cmp::Ordering::Equal => {
               low = mid + 1;
            }
            std::cmp::Ordering::Greater => {
               high = mid;
            }
         }
      }
      low
   }
}

fn gcd(a: usize, b: usize) -> usize {
   match b {
      0 => a,
      _ => gcd(b, a % b),
   }
}

fn check((a1, b1): (usize, usize), (a2, b2): (usize, usize)) -> bool {
   let c1 = b2 / gcd(b1, b2);
   let c2 = b1 / gcd(b1, b2);
   a1 * c1 < a2 * c2
}


Measured memory_bytes: 4352