2009-11-24 2 views
2

나는 아이템 세트를 던지기 위해 100 점을 얻었다. 각 항목은 다른 점 (비중)에 비례하여 비례적인 수의 점수를 받아야합니다. 일부 항목은 0의 가중치를 가질 수 있지만 일부 점수를 받아야합니다.가중치 항목간에 포인트를 분배하는 알고리즘은 무엇입니까?

각 항목에 5 점을 부여한 다음 비례하여 나머지 지점을 채우려고했지만 21 항목이있을 때 알고리즘이 0 항목을 하나의 항목에 할당합니다. 물론 처음에는 1 점을 나눠 줄 수는 있지만 101 점 이상은 문제가 남아 있습니다. 일반적으로이 알고리즘은 20 개 미만의 항목을 처리해야하지만 더 많은 항목을 처리 할 때 알고리즘이 강력하기를 원합니다. 나는 수레를 사용하여 알고

은/분수는 완벽 할 것이지만, 기본 시스템은 정수를 받아야합니다, 나는 루비에 구현됩니다 있지만 총, 100

이것은 프레임 워크/언어 무신론자해야합니다.

현재, 나는이 (의사 코드)이 :

total_weight = sum_of(items.weight) 
if total_weight == 0 then 
    # Distribute all points equally between each item 
    items.points = 100/number_of_items 
    # Apply remaining points in case of rounding errors (100/3 == [33, 33, 34]) 
else 
    items.points = 5 
    points_to_dole_out = 100 - number_of_items * 5 
    for(item in items) 
    item.points += item.weight * total_weight/100 
    end 
end 

답변

5

첫째, 모든 항목을 한 지점을 제공합니다. 이것은 모든 항목이 포인트를 얻는 요구 사항을 충족하기위한 것입니다. 그런 다음 각 항목에있는 전체 무게의 %를 가져 와서 나머지 점의 %를 표시합니다 (반올림).

남은 부분이 일부 남아 있습니다. 항목 세트를 소수 부분의 크기로 정렬 한 다음, 소수점 이하부터 작은 순서로 한 번에 하나씩 나머지 점을 제거하십시오.

따라서 항목의 가중치가 12이고 모든 항목의 총 가중치가 115 인 경우 먼저 1 점을 얻습니다. 다른 항목이 4 개있는 경우 최소 점수를 내린 후 110 점이 남습니다. 총 중량의 비율이 9.58이고 10.538이 110의 9.58 %이기 때문에 10 점을 얻게됩니다. 그런 다음 .538을 기준으로 정렬하고 상단 근처에 있다면 충돌 할 수 있습니다. a 11.

+0

+1 : 나는 이와 같은 해결책을 타이핑하고있었습니다. –

+1

남은 부분에서 여분의 포인트를 나눠주기 전에 모든 사람이 적어도 1 점을 지니고 있는지도 확인해야합니다. –

+0

잘 부탁드립니다. 그 요구 사항을 놓쳤습니다. 편집 –

3

두 가지 제약 {total == 100} {각 항목> 0}이 주어지면 101 개의 경우를 해결할 수 없습니다. 따라서 견고하기 위해서는 해결 방법을 찾아야합니다. 그것은 기술적 문제가 아닌 비즈니스 문제입니다.

최소 점수는 실제로 비즈니스 문제이기도합니다. 분명히 항목 당 5 분을 버리면 분명히 결과의 의미는 최소 점수 1과 다릅니다. 0이 아닌 낮은 점수와 낮은 점수 사이의 격차는 잠재적으로 압축됩니다. 따라서 번호를 선택하는 것보다 시스템 사용자가 명확하게 이해해야합니다 :이 데이터는 어떻게 사용됩니까?

관련 문제