找到具有给定除数的最接近的较高数
本文关键字:最接近 高数 | 更新日期: 2023-09-27 18:06:50
我必须为客户分配项目。在分配算法中,在我分配剩余项目之前,所有客户都应该有一个特定的最小值。
其中一些项目是预先挑选的。对于这些预先挑选的物品,至少给出一个集装箱数量。有时两个。
我需要一个有效的算法来找到最小值,该最小值高于每个客户给定的最小值,并且可以除以至少一个没有余数的集装箱数量。
这里有一些极简主义代码,以更好地理解:
int containerQty1;
int? containerQty2; // Can be null
int customerMinimum;
int minimumToGet;
在本例中,minimumToGet
应具有比customerMinimum
更高的值,但必须在没有余数的情况下除以containerQty1
或containerQty2
。
给定两个数字M
和D
,可以在M
之上构造最小的数字X
,使D
除以X
,方法是先将D
加到M
,然后减去总和除以D
的余数,即
int X = (M+D) - ((M+D) % D);
示例:M = 200
、D = 13
。我们正在寻找一个最小的倍数13以上200。
int X = (200+13) - ((200+13) % 13) = 213 - 5 = 208;
将客户最小值除以两个容器后,找到剩余值。添加最小的(不含容器的剩余部分(。
例如,客户最小值=20,q1=7,q2=11。
20+(7-20%7(=21
20+(11-20%11(=22。
所以在这种情况下,你可以选择7个容器和21个。
static int AmountToGet(int containerQty, int custMin) {
return custMin + containerQty - (custMin % containerQty);
}
现在有了这个:
var amountToGet = AmountToGet(containerQty1, minimumToGet);
if (containerQty2 != null) {
amountToGet = Math.Min(amountToGet, AmountToGet((int) containerQty2, minimumToGet));
}