问题:现有1000个苹果,10个盒子,现在要你将1000个苹果装入10个盒子中,使得用户无论购买多少个苹果(1到1000),都能由若干个盒子拼装而成(卖的时候是整个盒子卖,不能拆盒子的包装)
解题之前补充一个知识点:现有1、2、4、8四个数,他们可以组成任意1到15的数字。所以有一个定理:
所以根据这个定理我们可以分析得出:
2的10次方为1024;2的9次方为512。1000介于512到1024之间,所以这里取n等于10。
import java.util.Arrays;
/**
* 现有1000个苹果,10个盒子,现在要你将1000个苹果装入10个盒子中,
* 使得用户无论购买多少个苹果(1到1000),都能由若干个盒子拼装而成
* (卖的时候是整个盒子卖,不能拆盒子的包装)
* @author 直到世界尽头
*/
public class 分苹果 {
public static void main(String[] args) {
System.out.println(Arrays.toString(FenPinGuo(1000,10)));
}
/**
* 知识点
* 从二进制的角度考虑,1, 2, 4, 8这四个数,由这四个数可以组成1到15之间任意一个数,
* 也即1,2, 4 ... 2的n次方可以组成1到2的(n+1)次方-1之间所有的数。
*
* 具体问题分析:
* 1000介于512与1024之间
* 所以取假设有1024个苹果,n等于9
* @param sun 苹果总数
* @param n 盒子数量
*/
public static int[] FenPinGuo(int sum,int n){
int[] array=new int[n];
int m=n-1;
int capacity=sum;
for(int i=0;i<n;i++){
int num=(int) Math.pow(2,i);
if(capacity>num){
array[i]=num;
}else{
array[i]=capacity;
}
capacity=(capacity-num)>0 ? (capacity-num):0;//剩余量
}
return array;
}
}