[Линейный дп] C000_ Положите Apple

1. Название Описание

Поместите 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 В то время, должно быть, пустые корзины ba. Эти корзины не влияют на мой выбор размещения, потому что я могу только позволить корзине иметь яблоки.
  • b <= a Когда это можно разделить на две ситуации:
    • a = b Когда, на самом деле, вариантов очень много:
      • Пусть корзина опустеет. Но чтобы быть скудной и не пропустить, я оставляю не более одной корзины за раз.
      • Держите корзины пустыми: или каждая корзина полна.
    • b < a Есть также два варианта:
      • Пусть корзина опустеет. Но чтобы быть скудной и не пропустить, я оставляю не более одной корзины за раз.
      • Пусть корзина не будет пустой, пусть в корзинах по одному яблоку, а остальные ab строят другие планы.
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 ()

Способ 2: дп

Поверенный в делах ...


Анализ сложности

  • Сложность времени: ( ) O ()
  • Пространственная сложность: ( ) O ()
Опубликовано 714 оригинальных статей · Хвала 199 · 50 000+ просмотров

рекомендация

отblog.csdn.net/qq_43539599/article/details/105619242
рекомендация