【线性 dp】C000_放苹果

一、题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入
1
7 3
样例输出
8

二、题解

方法一:暴搜

设 a 为苹果数,b 为篮子数,情况列举如下:

  • a = 1 || b == 1 时:
    • 把仅有的一个苹果放到某一个篮子。
    • 或者把所有苹果放到仅有的一个篮子。
  • b > a 时,必定有 b-a 个篮子是空着的,这些篮子不影响摆放我的选择,因为我最多只能让 a 个篮子有苹果。
  • b <= a 时,可分为两种情况:
    • a = b 时,其实这里有很 n 多种选择:
      • 让篮子空:但是为了做到疏而不漏我每次至多只让一个篮子空着。
      • 让篮子不空:或者每个篮子都放满。
    • b < a 时, 也有两种选择:
      • 让篮子空:但是为了做到疏而不漏我每次至多只让一个篮子空着。
      • 让篮子不空,先让 b 个篮子里各有 1 个苹果,剩下的 a-b 个苹果另做打算。
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static boolean[] vis;
	static int res;
	
	private static int dfs(int a, int b) {
		if (a == 1 || b == 1)
			return 1;
		if (a == b) 
			return dfs(a, b-1) + 1;
		if (a < b)
			return dfs(a, a);
		if (a > b)
			return dfs(a, b-1) + dfs(a-b, b);
	}
    public static void main(String[] args) throws IOException {  
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        BufferedWriter w = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int t = sc.nextInt();
		while (t-- > 0) {
			int a = sc.nextInt();	//app
			int b = sc.nextInt();	//篮子
			System.out.println(dfs(a, b));
		}
    }
}

复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()

方法二:dp

代办…


复杂度分析

  • 时间复杂度: O ( ) O()
  • 空间复杂度: O ( ) O()
发布了714 篇原创文章 · 获赞 199 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/105619242