分苹果问题

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

    }
}

猜你喜欢

转载自blog.csdn.net/xikai18827083487/article/details/77924535