平均分配桶中的“项目”(尽力而为)

时间:2014-02-11 21:40:53

标签: java algorithm math distribution

说我想将y个项目均匀地分发到x个桶。如果xy的倍数,则此分布将是均匀的,如果不是,我最终可以在每个存储桶中使用0个项目。例如:

例如:我有3个桶,我想分发2个项目。由于进行除法(2/3)将导致每个桶0个项目。我如何实现110的分发?

6 个答案:

答案 0 :(得分:6)

第一个y mod x存储分区将包含(y div x) + 1个项目,其余部分将包含y div x个项目

答案 1 :(得分:6)

这种想法应该有效:

package sandbox;

public class Sandbox
{

    public static void main(String[] args)
    {
        int numBuckets = 12;
        int numItems = 34;

        int itemsPerBucket = (numItems / numBuckets);
        int remainingItems = (numItems % numBuckets);

        for (int i = 1; i <= numBuckets; i++)
        {
            int extra = (i <= remainingItems) ? 1:0;
            System.out.println("bucket " + i + " contains " + (itemsPerBucket + extra) + " items.");
        }
    }
}

输出:

bucket 1 contains 3 items.
bucket 2 contains 3 items.
bucket 3 contains 3 items.
bucket 4 contains 3 items.
bucket 5 contains 3 items.
bucket 6 contains 3 items.
bucket 7 contains 3 items.
bucket 8 contains 3 items.
bucket 9 contains 3 items.
bucket 10 contains 3 items.
bucket 11 contains 2 items.
bucket 12 contains 2 items.

请注意,您所做的唯一循环是讨论每个存储桶。你可以轻松地询问一个桶号,看看它中有多少物品没有循环!

答案 2 :(得分:3)

每个桶获得y / x(整数除法)项,y%x桶获得1个额外项。

答案 3 :(得分:0)

你的问题是模糊的,但是从itemsNumber的分区中取出余数(如果它们在列表或数组中可能是索引),那么作为桶的索引的桶数将给出你正在寻找的均匀分布。

int bucketIndex = itemNumber % numberOfBuckets; 

答案 4 :(得分:0)

它看起来你知道如何解决编程问题,但你正在寻找一个想法,我认为你在pascal的三角形中的答案,认为与pascal的三角形有点不同,把你的整个项目放到三角形的顶部单元格中。所以,实际上,我认为这不是最好的努力

答案 5 :(得分:0)

这里是一个递归解决方案,只是为了好玩。

import java.util.Arrays;

public class PizzaDistributor {

  public int[] distributePizzaToEatersEvenly(int numSlices, int[] eaters) {
    if (eaters == null || eaters.length == 0) {
      return null;
    }
    if (eaters.length > numSlices) {
      for (int i = 0; i < numSlices; i++) {
        eaters[i] += 1;
      }
    } else {
      int slices = numSlices / eaters.length;
      for (int i = 0; i < eaters.length; i++) {
        eaters[i] = slices;
      }
      //If there is a remainder to distribute, distribute it evenly, recursively.
      if ((numSlices % eaters.length) > 0) {
        distributePizzaToEatersEvenly(numSlices % eaters.length, eaters);
      }
    }
    return eaters;
  }

  public static void main(String[] args){
    PizzaDistributor pizzaDistributor = new PizzaDistributor ();
    System.out.println("0 slices, 1 eater:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[1])));
    System.out.println("0 slices, 2 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[2])));
    System.out.println("0 slices, 0 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[0])));
    System.out.println("10 slices, 0 eaters:"+Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[0])));
    System.out.println("10 slices, 1 eater:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[1]))); //lucky guy!
    System.out.println("10 slices, 3 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[3])));
    System.out.println("10 slices, 5 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[5])));
    System.out.println("10 slices, 7 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[7])));
    System.out.println("10 slices, 10 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[10])));
    System.out.println("10 slices, 13 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[13])));
    System.out.println("10 slices, 20 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[20])));

  }

}

产生此输出:

0 slices, 1 eater:[0]
0 slices, 2 eaters:[0, 0]
0 slices, 0 eaters:null
10 slices, 0 eaters:null
10 slices, 1 eater:[10]
10 slices, 3 eaters:[4, 3, 3]
10 slices, 5 eaters:[2, 2, 2, 2, 2]
10 slices, 7 eaters:[2, 2, 2, 1, 1, 1, 1]
10 slices, 10 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
10 slices, 13 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
10 slices, 20 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Process finished with exit code 0
相关问题