给定N个磁盘,每个磁盘大小为D,i=0...N-1,现在要在这N个磁盘上"顺序分配"M个分区,每个分区大小为P[j], j=0....M-1,顺序分配的意思是:分配一个分区P[j]时,如果当前磁盘剩余空间足够,则在当前磁盘分配;如果不够,则 尝试下一个磁盘,直到找到一个磁盘D[i+k]可以容纳该分区,分配下一个分区P[j+1]时,则从当前磁盘D[i+k]的剩余 空间开始分配,不在使用D[i+k]之前磁盘末分配的空间,如果这M个分区不能在这N个磁盘完全分配,则认为分配失败,请实现函数,is_allocable判断给定N个磁盘(数组D)和M个分区(数组P),是否会出现分配失败的情况。 举例:磁盘为[120,120,120],分区为[60,60,80,20,80]可分配 ,如果为[60,80,80,20,80]则分配失败。
public static void main(String[] args)
{
int[] d = { 120, 120, 120 };// 磁盘
// int[] p = { 60, 60, 80, 20, 80 };// 分区
int[] p = { 60, 80, 80, 20, 80 };// 分区
if (is_allocable(d, p))
{
System.out.println("分配成功");
}
else
{
System.out.println("分配失败");
}
}
private static boolean is_allocable(int[] d, int[] p)
{
int pindex = 0;//记录已分配的分区
boolean isAllocable = false;//用来记录是否分配成功
for (int i = 0; i < d.length; i++) //对所有磁盘遍历
{
while (d[i] > 0) //如果该磁盘还有剩余空间,就一直迭代
{
if (p[pindex] <= d[i]) //如果磁盘空间足够,就分配,否则,进入下一个磁盘
{
d[i] -= p[pindex++];
if (pindex == p.length) //如果已分配的分区数跟传入的一值,意味着分配成功
{
isAllocable = true;
break;
}
}
else
{
break;
}
}
if (isAllocable)
{
break;
}
}
return isAllocable;
}