说我想将y
个项目均匀地分发到x
个桶。如果x
是y
的倍数,则此分布将是均匀的,如果不是,我最终可以在每个存储桶中使用0
个项目。例如:
例如:我有3
个桶,我想分发2
个项目。由于进行除法(2/3)
将导致每个桶0
个项目。我如何实现1
,1
,0
的分发?
答案 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