这个可以通过从一个苹果开始,不断往上推,推到第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;
    }
}