2010-08-16 6 views
6

요청한 수량에 따라 소모품 키트를 제안하는 시스템을 구성하려고합니다. 제가 직면 한 과제는 키트에 대량/대량 할인이 있으므로 가격이 더 낮을 수 있기 때문에 고객이 대량 주문을하는 것이 더 저렴할 수 있습니다. , $ (7) 대량 주문 할인 가격

  • 5 위젯 $ 1
  • 위해 $ 4

  • 1 위젯의 위젯 지금 $ (15)
  • 10

    • 25 위젯 : 예를 들어, 사용 가능한 키트는 가정 해 봅시다 요청 된 수량이 74 일 때, 내 알고리즘은 2 x 25, 2 x 10 및 4 x 1 = $ 48을 제안합니다. 그러나 고객이 단지 3 x 25 = $ 45를 주문하는 것이 더 저렴할 것입니다.

      이 문제를 해결하는 방법에 대한 의견이 있으십니까? 나는 C#으로 코딩하고있다.

      감사합니다.

  • +2

    의 장소에서 첫 번째 체크 후 갈 것입니다. 그냥 코딩하는 대신 그와 이야기하십시오 ;-) –

    +0

    나에게 협상 할 의향이 있습니까? ;) – Jayoaichen

    답변

    7

    표준 DP (동적 프로그래밍)와 비슷합니다.

    // bestPrice is array of best prices for each amount 
    // initially it's [0, INFINITY, INFINITY, INFINITY, ...] 
    
    for (int i = 0; i <= 74; ++i) { 
        for (Pack pack : packs) { 
         // if (i + pack.amount) can be achieved with smaller price, do it 
         int newPrice = bestPrice[i] + pack.price; 
         if (newPrice < bestPrice[i + pack.amount]) { 
          bestPrice[i + pack.amount] = newPrice; 
         } 
        } 
    } 
    

    대답은 min(bestPrice[74], bestPrice[74 + 1], ... bestPrice[74 + 25 - 1])입니다. 오버 헤드 25 - 1은 분명히 충분합니다. 그렇지 않으면 한 팩을 지울 것이고 금액은 여전히 ​​>= 74이 될 수 있습니다. 주제에

    일부 링크 : 당신이 그것을 조금 수정하면 당신은 최적의 솔루션을 찾을 수 있습니다

    http://en.wikipedia.org/wiki/Dynamic_programming
    http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg

    편집. lastPack 어레이를 추가하십시오. 따라서 lastPack[i]은 금액이 i 인 패키지의 크기입니다. 위의 의사 코드를 업데이트하는 방법을 알 수 있습니다.

    알고리즘이 완료되면, 당신은이

    int total = 74; 
    while (total > 0) { 
        // package of size lastPack[total] was used to get amount 'total' 
        // do whatever you want with this number here 
    
        total -= lastPack[total]; 
    } 
    
    +3

    ''다이나믹이라는 단어는 Bellman이 인상적으로 들렸 기 때문에 선택되었습니다. 어떻게 작동하는지 설명했기 때문에가 아닙니다. " – Greg

    +0

    동적 프로그래밍은 "캐시 된 프로그래밍"이라고 부르거나 메모리를 사용한다는 것을 나타내는 것일 수 있습니다. –

    +0

    안녕하세요 Nikita! 답변 주셔서 감사합니다. 이걸 이해하려고 노력하면서 저와 함께 견뎌내십시오. 제가 필요한 양을이 팩에서 어떻게 알 수 있습니까? bestPrice 배열이 주어진 수량에 대해 가능한 최상의 가격을 제공하는 것으로 보이지만 그 수를 얻는 방법을 알려줍니까? – Jayoaichen

    2

    글쎄, 25 번째 단위부터 가격은 $ 0.60/item입니다. 고객이 25 이상을 주문하는 경우 계산중인 패키지를 잊어 버리고 수량에 $ 0.60을 곱하면됩니다.

    +0

    안녕하세요 NinjaCat - 빠른 답장을 보내 주셔서 감사합니다. 불행히도 이러한 키트는 미리 정해진 수량으로 포장되어 있으며 가격은 고정되어 있습니다. 따라서 키트의 단가를 변경할 수는 없습니다. 말이 돼? – Jayoaichen

    3

    같은 솔루션은 그래서 당신이 실제로 그런 기본적으로 조회 테이블을 사용하여 수동으로 (25)의 순서에 따라 항목에 대한 중단 점을 모두 결정해야 할 것 얻을 수 있습니다 type 시나리오를 사용하여 25 미만의 수량을 주문해야하는지 결정합니다. 이전에 지적했듯이 이는 배낭 문제와 매우 유사합니다.

    기본적으로 코드는 다음과 유사합니다.

    int qtyOrder; 
    int qtyRemain; 
    int qty25pack; 
    int qty10pack; 
    int qty5pack; 
    int qty1pack; 
    
    //Grab as many 25 packs as possible 
    qty25pack = (qtyOrder % 25); 
    qtyRemain -= qty25Pack * 25; 
    
    //Here use your lookup table to determine what to order 
    // for the qty's that are less than 25 
    

    당신은 어떤 종류의 욕심 많은 알고리즘을 사용하여 즉시 판단 할 수 있습니다. 가격이 많이 바뀔 것으로 예상되면 이상적입니다.

    정확히 일치하는 패키지 크기를 채우고 남아있는 수량보다 조금 더 가까운 가장 가까운 일치를 결정하고 더 싼지 확인할 수 있습니다.

    그래서 예를 들면

    :

    //find the perfect product amount price 
    While (qtyRemain != 0) { 
    perfectPrice += (qtyRemain % nextSmallestSize) * nextSmallestPackagePrice; 
    qtyRemain -= (qtyReamin % nextSmallestSize) 
    } 
    
    //Find the closest match over price 
    While ((qtyRemain % nextSmallestSize) != 0){ 
    closePrice += (qtyRemain % nextSmallestSize) * nextSmallestPackagePrice; 
    qtyRemain -= (qtyRemain % nextSmallestSize) 
    } 
    //add the last price before we reached the perfect price size 
    closePrice += nextSmallestPackagePrice; 
    
    //determine lowest price 
    if closePrice < perfectPrice { 
    cost = closePrice; 
    } 
    else { 
    cost = PerfectPrice; 
    } 
    

    이 코드가 완료 근처에 어디 없지만 당신에게 아이디어를 줄 것이다. 코드도 아마도 가장 위대한 것은 아닙니다.

    편집

    코드의 두 번째 덩어리는 당신이 더 많은 상품을 주문할 수 있습니다 경우 판매자는 당신에게 낮은 가격을 줄 것이다 확신 조회

    +0

    +1 : 이것은 OP를 최적화 된 솔루션으로 이끌어야하는 좋은 예입니다. – NotMe

    +0

    @Chris Lively 감사합니다! 그건 목표 였고, 나는 해결책의 해결책을 제시하는 것이므로 누군가가 붙여 넣기를 복사 할 수 있다고 느낍니다. – msarchet

    +0

    그러면 항상 최적의 솔루션을 제공하지 못합니다 (배낭 문제에 대한 다른 휴리스틱처럼). 예를 들어, 가격 {1 : 2, 5 : 7, 10 : 10, 25 : 24}과 금액 30을 확인하십시오. –

    관련 문제