问题:现有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;}
}