简介

练习

question

有一个护士工作站点,每天(周一至周日)所需最少职员数量20,16,13,16,19,14,和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。

code

model:
sets:
days/mon..sun/:r,x;
indexs/1..5/:index;
endsets
data:
r=20 16 13 16 19 14 12; ! 每天所需的最少的职员数量;
enddata
min=@sum(days: x); !最小化每周所需要的的职员数量;
@for(days(i):@sum(indexs(j):x(@wrap(i-j+1, 7))) >= r(i));
@for(days:@gin(x));!约束x为整数变量;
end

answer

                        X( MON)        8.000000            1.000000
                        X( TUE)        2.000000            1.000000
                        X( WED)        0.000000            1.000000
                        X( THU)        6.000000            1.000000
                        X( FRI)        3.000000            1.000000
                        X( SAT)        3.000000            1.000000
                        X( SUN)        0.000000            1.000000

自问自答环节~~

wrap的使用方式?

wrap(i-j+1, 7) 返回 1 - 7 之间的内容, 比如, i = 1, j = 4, i - j + 1 = -2 --> 5 就像一个环 

校验结果

MON 安排了8个人,往前再倒推4天就是MON上班的人数
8 + 0 + 3 + 3 + 6 = 20 >= 20; bingo
TWO 安排了2个人,往前在倒推4天就是TWO上班的人数
2 + 8 + 0 + 3 + 3 = 22 >= 16; bingo
再校验一个结果
SUN 安排了0个人,往前再倒推4天就是SUN上班的人数
0 + 3 + 3 + 6 + 0 >=12; bingo

posted on 2020-07-15 09:05  HDU李少帅  阅读(131)  评论(0编辑  收藏  举报