递归or动态规划 | HJ61 放苹果
# 最优解1:递归 def solution(m, n): # 如果没有苹果或只有1个苹果,则方案数返回1;如果只有一个盘子,剩下苹果必须全放盘里,也只剩一种方案 if m == 0 or m == 1 or n == 1: return 1 # 如果盘子数量多于苹果,说明必定有n-m个盘子会空着,必定的事情不会影响方案数 elif n > m: return solution(m, m) else: # 如果苹果多于盘子,盘子空一个,则要递归(m,n-1);不空,则所有盘子都至少放一个苹果(m-n,n) return solution(m, n-1) + solution(m-n, n) return while True: try: m, n = map(int, input().split()) print(solution(m, n)) except: break # 最优解2:动态规划 def solution(m, n): dp = [[0 for i in range(n+1)] for j in range(m+1)] for i in range(m+1): dp[i][1] = 1 # 如果只有一个盘子则只有一种放置方案 for j in range(1, n+1): dp[0][j] = 1 # 如果没有苹果则只有一种放置方案 dp[1][j] = 1 # 如果只有一个苹果也相当于只有一种方案 for i in range(2, m+1): for j in range(2, n+1): if i < j: # 如果苹果数量少,则盘子一定会空,所以去除那些空的盘子其实不影响方案数 dp[i][j] = dp[i][i] else: # 如果苹果数量多,则考虑是否要装够j个盘子,如果不装够则有dp[i][j-1],如果装够则相当于从所有盘子同时去掉一个苹果无影响,则有dp[i-j][j] dp[i][j] = dp[i-j][j] + dp[i][j-1] return dp[m][n] while True: try: m, n = map(int, input().split()) print(solution(m, n)) except: break # 我的代码(超时不通过) import copy def func(apples, plates): if not apples: tmp = sorted(copy.deepcopy(plates)) if tmp not in res: res.append(tmp) return for i in range(len(plates)): plates[i] += 1 func(apples-1, plates) plates[i] -= 1 a, p = list(map(int, input().split())) plates = [0] * p res = [] func(a, plates) print(len(res))
用时:40min
华为笔试刷题 文章被收录于专栏
高质量题: 1~40:HJ16,HJ22,HJ24,HJ26,HJ27,HJ28,HJ35,HJ37,HJ39; 40~80:HJ41,HJ42,HJ43,HJ44,HJ48,HJ50,HJ52,HJ53,HJ57,HJ61,HJ63,HJ64,HJ70,HJ71,HJ74,HJ77; 80~108:HJ82,HJ85,HJ88,HJ89,HJ93,HJ95,HJ98,HJ103,HJ107