2014-10-04 2 views
0

매개 변수로받은 금액을 취하고 화면에 선택 항목을 출력하고 백분율을 반환하는 selectFood라는 메서드를 만들려고합니다. 팁 나는 한 소수점 이하를 반올림하여 떠날 것이다.주어진 메뉴에서 목표 값보다 큰 가격을 찾는 법을 모르겠다

팁이 재귀를 통해 완료되지 않을 경우 가능한 비용이 들지만 비교하고 더 큰 것을 찾아야합니다. 가되는 외에 도와주세요

public static void selectFood(double money){ 
    /*String[]menu={"Bandera Pizza Bread","Boston's Pizza Bread","Garlic Twist Bread","Single Order", 
       "Sun-Dried Tomato Bruschetta","Three Cheese Toast","Double Order wings","Starter Size wings", 
       "Cactus Nachos","Baked Ravioli Bites","Southwest Quesadilla"}; 
    */ 
    double[]itemCost={6.49,5.35,7.49,5.35,6.99,6.35,16.49,8.99,10.29,8.49,9.25}; 

    possibilities(itemCost.length,"",itemCost,money); 

    //selectFood(n,itemCost,0); 
} 

public static void possibilities(int length,String sofar,double[]itemCost,double money){ 

    if(length==0){ 
     //selectFood(sofar,itemCost,money,0); 
     float totCost=0; 

     double target=money/1.15; 
     double minTip=money-target; 

     char[]sofarList=sofar.toCharArray(); 
     for(int i=0;i<sofarList.length;i++){ 
      if(sofarList[i]=='1'){ 
       totCost+=itemCost[i]; 
      } 

     } 
     if(totCost<target){ 
     System.out.println(totCost); 
     } 

    } 
    else{ 
     possibilities(length-1,sofar+"0",itemCost,money); 
     possibilities(length-1,sofar+"1",itemCost,money); 
    } 
} 

는 지금은 (당신은 아마 당신의 방법이 다시

0.0 

8.49 6.35 6.99 5.35 7.49 5.35 6.49

+0

ps 목록을 사용할 수 없습니다. – Collin

+0

그래서 ** 선택 항목 중 ** 항목 하나를 원합니다. 즉, 여전히 구입할 수있는 가격이 가장 비쌉니까? 또는 당신이 아직도 가질 여유가있는 가장 비싼 선택 품목의 ** 조합 **을 원하십니까? –

+0

첫 번째 질문이 옳기 때문에 전반적으로 8.49면 돌아가고 싶습니다. – Collin

답변

0

대상 값보다 큰 값을 찾으려면 재귀를 통해 반복 할 때마다 현재 최대 값을 유지하는 변수가 필요합니다.

나는 현재 최대 값

public static void possibilities(int length,String sofar,double[]itemCost,double money){ 
    if(length==0){ 
     //selectFood(sofar,itemCost,money,0); 
     float totCost=0; 

     double target=money/1.15; 
     double minTip=money-target; 

     char[]sofarList=sofar.toCharArray(); 
     for(int i=0;i<sofarList.length;i++){ 
      if(sofarList[i]=='1'){ 
       totCost+=itemCost[i]; 
      } 

     } 
     if(totCost<target && totCost>max){ 
      max = totCost; 
      System.out.println(totCost); 
      for(int i=0;i<sofarList.length;i++){ 
       System.out.print(sofarList[i]); 
      } 
      System.out.println("\n"); 
     } 

    } 
    else{ 
     possibilities(length-1,sofar+"0",itemCost,money); 
     possibilities(length-1,sofar+"1",itemCost,money); 
    } 
} 

을 추적하는 프로그램의 로직을 변경하고 당신은 내가 인쇄 문을 추가

static double max=0; 

클래스 내에서 정적으로 변수 최대를 선언 할 필요가 각각의 가능한 반복에서 선택된 최대 값을 보여줍니다.

static String menulist=null; 

아래에 주어진 최대 값은 우리가 필요로하는 메뉴 목록의 max 변수 및 유지 트랙에 저장되어있는 모든 반복의 종료 후

하나 이상의 정적 변수를 추가하고 우리는 할당해야 메소드 내의 값

if(totCost<target && totCost>max){ 
      max = totCost; 
      menulist = sofarList; 
} 
+0

가장 높은 최대 값만 반환하도록 어떻게 변경합니까? – Collin

0

말썽 얻을 상대적으로 이해하기 힘들다.) 당신의 방법은 실제로 값을 계산하지 않는다는 것이다. System.out에 무엇인가를 인쇄 중입니다. 일반적으로 사용자의 메서드는 중 하나가 또는 상태를 변경 (예 : I/O 수행)하지만 둘 다 수행하지 않아야합니다.

간단한 수정은 totCost을 인쇄하는 대신 인스턴스 변수에 저장하는 것입니다.

if(totCost < target){ 
    System.out.println(totCost); 
} 

highestPrice는 인스턴스 변수입니다

if(totCost < target && highestPrice < totCost){ 
    highestPrice = totCost; 
} 

에 : 그것은 당신의 라인을 변경할 수 있습니다. 이제 selectFood 메소드에서 highestPrice에 액세스 할 수 있습니다.

이것은 깨끗한 해결책보다는 해킹입니다. possibilities 메서드가 일반 반환 값으로 계산 된 값을 반환하면 코드가 훨씬 더 명확 해집니다. 당신은 재귀 적 비용을 계산 얼마나

다시 생각이 :

  • 당신은 가격 (귀하의 경우, 배열)을 설정하고 예산을 주어진다. 각각의 가격이 다음 중 하나를 수행 할 수 있습니다 항목을 가지고 가격을 지불하거나 목록에서 하나의 항목 만있을 경우 당신이 돈

  • 를 항목을 가지고 지킬 수없는, 가장 비싼 조합을 위해

  • 당신이 할 수있는 경우에 당신이 품목을, 또는 품목의 가치를 줄 수없는 경우에 만들 수있다 0,이다.

마지막 포인트는 기본 케이스입니다 (빈 어레이가있을 수도 있음). 그래서 당신은 기본 경우 여기

double possibilities(double[] items, double money){ 
    if (items.length == 1 && items[0] < money/1.15) return items[0]; else return 0; 

측면 참고가 : 코드에서 매직 넘버를 (예를 들어, 1.15) 넣지 마십시오. 그들은 어떤 의미도 전달하지 않습니다.

이제 일반적인 경우에 대해 items.length>1 : 첫 번째 항목을 가져갈 수도 있고 받아 들일 수도 있습니다. 우리가 가져 가면 남은 물건에 쓸 돈이 줄어 듭니다. 또한 우리가 감당할 수 있다면 즉, money>items[0] 인 경우에만 사용할 수 있습니다. 남은 돈과 나머지 아이템을 가지고 우리는이 방법을 반복적으로 호출하고 더 큰 가치를 취합니다.

if(items.length > 1) 
    if (items[0] < money/1.15) 
    double totCostWithItem0 = items[0] + possibilities(/* items[1 to length], money - items[0] */) 
    double totCostWithoutItem0 = possibilities(/* items[1 to length], money */) 
    return totCostWithItem0 > totCostWithoutItem0 ? totCostWithItem0 : totCostWithoutItem0; 
    else // cannot afford it 
    return possibilities(/* items[1 to length], money */ 

코드가 너무 죄송합니다. 배열 작업을하고 있기 때문에, 재귀 호출에서 항목 1을 길이에 맞게 복사하여 새 배열에 복사해야합니다. 또한 ... 1.15에 의한 부서가하는 일이 무엇인지 잘 모르겠습니다. 따라서 재귀 적으로 전달하는 돈을 조정해야 할 수도 있습니다.

관련 문제