愉快的三倍经验题。
简要题意:
给定 n , k n,k n,k,求将 n n n 分为 k k k 个有序正整数之和 的方案数。
6 ≤ n ≤ 200 , 2 ≤ k ≤ 6 6 \leq n \leq 200 , 2 \leq k \leq 6 6≤n≤200,2≤k≤6.
算法一
搜索 + 剪枝。
状态设计
首先我们应当考虑,如何设计搜索状态。
对本问题即以下的问题:
- 如何保证和为 n n n?
- 如何保证共 k k k 个数?
- 如何保证有序?
第一问,我们需要一个 sum
,记录当前所选数的和。
第二问,我们需要一个 p
,记录当前所选数的个数。
第三问,我们需要一个 ma
,记录当前所选数的最大值(其实也即上次选的数)。
那么,每次从 ma - sum
进行一个区间枚举即可。
但是时间复杂度是 指数级 的,不得不说对 n = 200 , k = 6 n = 200 , k = 6 n=200,k=