放苹果
放苹果
http://www.nowcoder.com/questionTerminal/bfd8234bb5e84be0b493656e390bdebf
这个可以通过从一个苹果开始,不断往上推,推到第N个苹果。
当我们只有一个苹果的时候,我们有几种情况?没错,1种,就是1。
现在,我们有两个了,相对于一个苹果,我们多了一个自由的苹果,它可以放在别的盘子里(11),也可以和刚才的苹果放在一起(2)。所以有两种情况。
现在,苹果有是三个了。相对于两个,我们又多了一个自由的苹果,它可以单放(11->111, 2->12),可以放在别的盘子里(11->12,2->3)。去掉重复,有三种可能。
以此类推。
去重,可以用HashSet。
HashSet里面存储int。做自由苹果处理时,将int转换为int数组,数组的长度是盘子数,这样自然就做了盘子数的限定。
代码如下:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int apples = sc.nextInt();
int plates = sc.nextInt();
if(apples<0||plates<=0){
System.out.println(-1);
continue; //这里要用continue而不是break,不然
}
if(apples==0){
System.out.println(0);
continue;
}
if(apples==1||plates==1){
System.out.println(1);
continue;
}
HashSet<Integer> hs=new HashSet<Integer>();
hs.add(1);
int now=2;
while(now<=apples){
int len=hs.size();
int[] data=new int[len];
int i=0;
for(int k:hs){
data[i++]=k;
}
hs.clear();
for(i=0;i<len;i++){
int k=data[i];
int[] possible=intToArray(k,plates);
possible[plates-1]++;
hs.add(arrayToInt(possible));
possible[plates-1]--;
for(int j=plates-2;j>=0;j--){
if(possible[j]!=possible[j+1]){
possible[j]++;
hs.add(arrayToInt(possible));
possible[j]--;
}
}
}
now++;
}
System.out.println(hs.size());
}
}
public static int[] intToArray(int k,int len){
int[] a=new int[len];
while(k>0){
a[--len]=k%10;
k=k/10;
}
return a;
}
public static int arrayToInt(int[] a){
int len=a.length;
int jie=1;
int b=0;
for(int i=len-1;i>=0;i--){
b=b+a[i]*jie;
jie*=10;
}
return b;
}
}
