题目是这样的。有600个苹果10个盒子,要求把600个苹果分装到10个盒子里。如果有人来买苹果随便说出一个数,直接拿这些盒子组装一下就可以给他不用拆分盒子。请问这10个盒子应该分别装多少苹果?— — — — — — — — — — 另外用下面的程序实现出来(Java)
public void countApple() {
int[] box = new int[10];
int count = 600;
// 这里填充代码;
}
public void countApple() {
int[] box = new int[10];
int count = 600;
// 这里填充代码;
}
你的问题,是不是有点 像 人民币的 1,2,5分(角,快)啊 可以任意组合成想要的rmb付钱撒。
不知道对不对!
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 + "号 ");
}
}
}
要实现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;
}
如果 苹果总数/2<2的(N-1)次方 (N为盒子个数) ,则可行.
否则不可行.
例如:苹果1024个,盒子10个.
那么要给客户512个,这样就做不到了.
因为1024/2=512=2的(10-1)次方.