얼마 전에 Stack Overflow 에서이 질문을했습니다. 문제 : Bob의 판매 . 누군가가 여기에 질문을 게시 할 것을 제안했습니다.
누군가가 이미이 문제와 관련된 질문을했습니다. 주어진 카디널리티의 최소 무게 하위 포리스트 -내가 이해하는 한 내 문제에 도움이되지 않습니다. StackOverflow에 대한 최고 등급의 답변도 살펴볼 가치가 있습니다.
다음은 내 StackOverflow 질문의 축약 사본입니다. 아마도이 사이트에 적합하게 공식화되지 않았을 것입니다 (여기서 묻는 것만으로는 교육이 충분하지 않다고 느낍니다).
참고 : 이것은 SWF 파일의 레코드 순서와 관련된 실제 문제를 요약 한 것입니다. 솔루션은 오픈 소스 애플리케이션을 개선하는 데 도움이됩니다.
Bob은 상점을 가지고 있으며 판매를 원합니다. 그의 상점에는 여러 제품이 있으며 재고가있는 각 제품의 특정 정수 수량 단위가 있습니다. 또한 가격이 이미 인쇄되어있는 여러 선반 장착 가격 레이블 (제품 수만큼)이 있습니다. 그는 모든 제품에 가격 레이블을 붙일 수 있습니다 (해당 제품의 전체 재고에 대해 한 품목의 단일 가격). 일부 제품에는 추가 제한이 있습니다. 이러한 제품은 다른 제품보다 저렴하지 않을 수 있습니다.
Bob의 모든 도자기의 총 비용이 가능한 한 낮도록 가격 레이블을 배열하는 방법을 찾아야합니다. 총 비용은 각 제품에 지정된 가격 레이블의 합계에 해당 제품의 수량을 곱한 값입니다.
주어진:
- N – 제품 및 가격 레이블 수
- S i , 0≤ i <N – 인덱스 i (정수) 의 제품 재고 수량
- P j , 0≤ j <N – 인덱스 j가있는 가격 레이블의 가격 (정수)
- K – 추가 구속 조건 쌍 수
- A k , B k , 0≤ k <K – 추가 구속 조건에 대한 제품 지수
- 모든 제품 색인은 B에 최대 한 번 나타날 수 있습니다. 따라서이 인접 목록에 의해 형성된 그래프는 실제로 일련의 방향 트리입니다.
프로그램은 다음을 찾아야합니다.
- M i , 0≤ i <N – 제품 인덱스에서 가격 레이블 인덱스로의 맵핑 (P M i 는 제품 i의 가격 임 )
조건을 만족 시키려면 :
- P M A k ≤ P M B k , 0≤ k <K
- 0≤i <N에 대한 Σ (S i × P M i ) 는 최소입니다
첫 번째 조건이 아닌 경우 솔루션은 단순히 가격과 제품을 수량별로 분류하고 레이블을 직접 정렬하는 것입니다.
입력의 일반적인 값은 N, K <10000입니다. 실제 문제에는 몇 가지 구별되는 가격표 (1,2,3,4) 만 있습니다.
가장 간단한 솔루션 (토폴로지 정렬 포함)이 작동하지 않는 이유는 다음과 같습니다.
당신은 가격 (1) (10)를 통해 수량으로 10 개 항목, 10 개 가격 레이블이 1 ~ 수량 1 항목보다 저렴 안됩니다 항목 수량 10 : 하나 개의 조건이있다 10.
최적의 솔루션은 다음과 같습니다.
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
총 비용이 249 인 경우. 1,10 쌍을 극단 부근에 배치하면 총 비용이 더 높아집니다.