题目是这样的。有600个苹果10个盒子,要求把600个苹果分装到10个盒子里。如果有人来买苹果随便说出一个数,直接拿这些盒子组装一下就可以给他不用拆分盒子。请问这10个盒子应该分别装多少苹果?— — — — — — — — — — 另外用下面的程序实现出来(Java)
public void countApple() {
     int[] box = new int[10];
     int count = 600;
     //  这里填充代码;

解决方案 »

  1.   


    你的问题,是不是有点 像 人民币的 1,2,5分(角,快)啊 可以任意组合成想要的rmb付钱撒。
      

  2.   

    初学者的代码,请不要嫌弃。
    不知道对不对!
    public void countApple(){
    int[] box = new int[10];
    int count = 600;

    int apple = 1;
    for(int i=0;i<box.length-1;i++){
    box[i] = apple;
    apple = apple *2;
    }
    box[9] = count-apple;
    Scanner sc = new Scanner(System.in);
    System.out.println("您要多少苹果呢?");
    int math = sc.nextInt();
    String bin = Integer.toBinaryString(math);
    //System.out.println(bin);
    char[] zero = bin.toCharArray();
    String[] str = new String[zero.length];
    for(int i=0;i<zero.length;i++){
    if("1".equals(zero[i]+"")){
    System.out.print(zero.length-i + "号 ");
    }
    }
    }
      

  3.   

    这个问题用分治可以解决吧?
    要实现10个盒子1-500组合,只要实现9个盒子1-250组合(剩一个装250);等于8个盒子实现1-125的组合
    最后,盒子中放1,1,2,4,8,16,31,62,125,250
    下面是递归程序:
    #include "stdio.h"
    #define OK 1
    #define ERROR 0
    typedef int Status;
    int box[10]={1,1,2,4,8,16,31,62,125,250};Status solve(int apple_num,int box_num){
    if(apple_num == 0)
    return OK;
    else if(box_num>=0){
    if(apple_num>=box[box_num])
    return solve(apple_num-box[box_num],box_num-1);
    else if(apple_num<box[box_num])
    return solve(apple_num,box_num-1);
    }
    else 
    return ERROR;
    }int main(){
    int count;
    for(count=1;count<=500;count++){
    if(solve(count,9))
    printf("%d is OK\n",count);
    }
    return 1;
    }
      

  4.   

    不用像#24想得那么复杂:小于等于511,用前9个盒组装就行了.[512,599]的数,用600-需求数=剩下的数,由于剩下的数是小于511的,那么用前9个盒组装出来,留给自己,其他给客户就行.600的话,那就.........不用说了.这样的话,我们可以总结可行性:
    如果 苹果总数/2<2的(N-1)次方 (N为盒子个数) ,则可行.
    否则不可行.
    例如:苹果1024个,盒子10个.
    那么要给客户512个,这样就做不到了.
    因为1024/2=512=2的(10-1)次方.