题解 | #放苹果# 很笨但是很直观的递归方法

放苹果

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

//解释看代码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;


public class Main {
    static List<List<Integer>> allList;
    private static void process(int appleNum, int plateNum, int allocated,
                                List<Integer> list) {
	  //还剩一个盘子没放,而且还有苹果那就全放在这个盘子里
        if (list.size() == plateNum - 1) {
            list.add(appleNum - allocated);
		  //深拷贝,这样对item排序不会影响list,这种以后会经常用的
            List<Integer> item = new ArrayList<>(list);
            item.sort(Comparator.comparingInt(i->i));
            allList.add(item);
            list.remove(list.size() - 1);
            return;
        }
	  //每个盘子循环数量
        for (int i = 0; i <= appleNum - allocated; i++) {
            list.add(i);
            process(appleNum, plateNum, allocated + i, list);
            list.remove(list.size() - 1);
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int appleNum = in.nextInt();
            int plateNum = in.nextInt();
		  allList=new ArrayList<>();
            process(appleNum, plateNum, 0, new ArrayList<>());
		  //去重
            System.out.println(allList.stream().distinct().collect(
                                   Collectors.toList()).size());
        }
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务