例如: 我有21个球的列表,我想在Bucket中分配它们。 铲斗尺寸应至少为2,最大为5。
I want output like
B1 has 5 Balls
B2 has 5 Balls
B3 has 5 Balls
B4 has 4 Balls
B5 has 2 Balls
这意味着我想将Buckets分配给最大数量的球,然后保留。 我们可以采用无限量的铲斗。 如果可能的话,我想用JAVA代码。 请帮我找到解决方案 谢谢
答案 0 :(得分:3)
n/5
将为您提供大小为5的桶数。
n%5
会给你剩下的部分。
如果n%5 >= 2
,请创建一个新存储桶并放置它们。
如果n%5 = 1
,请创建一个新存储桶,添加该存储桶,然后在另一个存储桶中选择一个存储桶。
此示例演示了算法:
public class Test {
public static void main(String[] args) {
place(21,5);
}
public static void place(int number, int sizeBucket){
int nbBuckets = number / sizeBucket;
int nbLeft = number % sizeBucket;
List<Bucket> lBuckets = new ArrayList<>();
for(int i = 0; i < nbBuckets; i++){
lBuckets.add(new Bucket(sizeBucket, sizeBucket));
}
if(nbLeft >= 2)
lBuckets.add(new Bucket(5, nbLeft));
else if (nbLeft == 1){
Bucket b = lBuckets.get(lBuckets.size()-1);
b.setSize(b.getSize()-1);
lBuckets.add(new Bucket(sizeBucket, nbLeft+1));
}
System.out.println(lBuckets);
}
}
class Bucket {
private int capacity;
private int size;
public Bucket(int capacity, int size) {
super();
this.capacity = capacity;
this.size = size;
}
public int getCapacity() {
return capacity;
}
public void setCapacity(int capacity) {
this.capacity = capacity;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Bucket [capacity=" + capacity + ", size=" + size + "]";
}
}
输出:
[Bucket [capacity=5, size=5], Bucket [capacity=5, size=5], Bucket [capacity=5, size=5], Bucket [capacity=5, size=4], Bucket [capacity=5, size=2]]
答案 1 :(得分:2)
1.检查一个桶装满5个球后是否留下至少两个球 2.如果不是,请尝试4等等......如果是2,那将是你的最后一桶 3.填充一个桶 4.只要你有足够的球,重复这些步骤
答案 2 :(得分:0)
我为你设计了一个通用方法,你可以输入最小,最大球数(用于桶)和总球数
获取要创建的存储区数量的方法。
long getNoOfBucket(long total, int max, int min) {
if (total % max < min && total % max != 0) {
return (total / max) + 1;
} else {
return total / max;
}
获取存储桶列表的方法。
List<List<Long>> getbucketOfBuckets(long total, int max, int min) {
List<Long> tempBucket = null;
List<List<Long>> parentbucket = new ArrayList<List<Long>>();
if (total % max < min && total % max != 0) {
long noOfBucket = getNoOfBucket(total, max, min);
for (long i = noOfBucket; i >= 1;i--) {
if (total % max < min && total % max !=0) {
total = total - min;
long tempVar = total+1;
tempBucket = new ArrayList<Long>();
for (long j = 1; j <= min; j++) {
tempBucket.add(tempVar);
tempVar++;
}
parentbucket.add(tempBucket);
} else {
long tempmax = 0;
if(total%max == 0){
tempmax = max;
}else{
tempmax = total%max;
}
total = total - tempmax;
long tempVar = total+1;
tempBucket = new ArrayList<Long>();
for (int j = 1; j <= tempmax; j++) {
tempBucket.add(tempVar);
tempVar++;
}
parentbucket.add(tempBucket);
}
}
}
else{
for (long i = noOfBucket; i >= 1; i--) {
total = total - max;
long tempVar = total + 1;
tempBucket = new ArrayList<Long>();
for (int j = 1; j <= max; j++) {
tempBucket.add(tempVar);
tempVar++;
}
parentbucket.add(tempBucket);
}
}
return parentbucket;
测试上述代码的主要方法
public static void main(String[] args) {
long total = Long.valueOf(args[0]);
int max = Integer.valueOf(args[1]);
int min = Integer.valueOf(args[2]);
long noOfBucket = BallServicesImplementation.getNoOfBucket(total, max,min);
List<List<Long>> parentBuclet = BallServicesImplementation.getbucketOfBuckets(total, max, min);
for(List<Long> itr : parentBuclet){
System.out.println("size :: "+itr.size());
for(Long seLong : itr){
System.out.print(seLong+"\t");
}
System.out.println("");
System.out.println("********************************************");
}
我已经在不同的测试用例下对它进行了测试。我可以尝试一下,如果需要更多改进,请告诉我。 希望它会对你有所帮助。