放苹果

日期:2025-06-10

所用时间:5min

1. 暴力搜索

思路:

  1. 使用记忆化搜索解决这个问题。定义状态 表示将 个苹果放入 个盘子中的方案数,其中 记录当前每个盘子的苹果数量。
  2. 状态转移分析:如果 且 ,说明还有苹果但盘子用完了,返回 0如果 ,说明所有盘子都分配完了,检查当前方案是否重复对于每个盘子,可以放入 0 到 个苹果,递归计算所有可能的方案
  3. 去重处理:使用 字典记录已经出现过的方案将每个方案排序后转换为字符串作为键值,确保相同方案只计算一次
  4. 具体转移方程:当 时:检查方案是否重复,返回 1 或 0否则:
  • 时间复杂度: O(n \times m \times j)
  • 空间复杂度: O(n \times m \times j)

Python3

m, n = map(int, input().split())

vis = {}
def dfs(i, j, path):
    # j 个水果放入 i 个盘子里
    if j > 0 and i == 0:
        return 0
    if i == 0:
        path.sort()
        path = "".join(path)
        if path in vis:
            return 0
        vis[path] = True
        return 1
     
    res = 0
    for cnt in range(j + 1):
        res += dfs(i - 1, j - cnt, path + [str(cnt)])
    return res

print(dfs(n, m, []))