1 // 相当于有n个物品,每个物品的体积V[i],要使得m个容量相同的桶能按顺序装下所有物品,求出桶的最小容量target 2 public int splitArray(int[] V, int m){ 3 // 待求解值target的范围为[max,sum] 4 int max = V[0]; 5 int sum = V[0]; 6 for (int i = 1; i < V.length; i++) { 7 max = Math.max(max,V[i]); 8 sum += V[i]; 9 } 10 // 二分法找到target值 11 int left = max; 12 int right = sum; 13 while (left < right) { 14 int mid = (left+right)/2; 15 // 判断当桶子容量为mid时能否装完所有物品,能装完则target <= mid, 不能装完则target > mid 16 if (isFit(V,mid,m)) { 17 right = mid; 18 } else { 19 left = mid+1; 20 } 21 } 22 return left; 23 } 24 // 判断当桶子容量为x时m个桶子能否装完所有物品,true表示可以装完物品,false表示还没装完 25 public boolean isFit(int[] V, int x, int m) { 26 // 当前桶数 27 int count = 1; 28 // 当前桶被填容量 29 int s = 0; 30 for (int i = 0; i < V.length; i++) { 31 // 没超过一个桶容量就放到该桶 32 if (s + V[i] <= x) { 33 s += V[i]; 34 } else { 35 // 超过一个桶容量就把该物品放到下一个桶,并把桶数+1 36 s = V[i]; 37 count++; 38 } 39 } 40 // 判断桶数是否超过x,count<=x表示没装完桶子,返回true,count>x表示桶子数不够没装完,返回false 41 if (count <= m) 42 return true; 43 else 44 return false; 45 }
原文:https://www.cnblogs.com/ningbing/p/14319124.html