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