1 条题解
-
1
题意分析
题目要求计算将块相同的蛋糕分配到个相同的盘子中的方法数。由于蛋糕和盘子都是不可区分的,因此这是一个典型的整数划分问题,即求将整数划分为最多个部分的方法数。
解题思路
- 问题转化:将问题转化为求的部分划分数,其中每个部分可以为。
- 动态规划:使用动态规划来记录状态转移,设表示将块蛋糕分配到若干盘子中的方法数。
- 状态转移:对于每个盘子,考虑是否放入块蛋糕,更新的值。
实现步骤
- 初始化:,表示块蛋糕有一种分配方法。
- 动态规划更新:
- 遍历每个盘子(从到)。
- 对于每个(从到),更新。
- 输出结果:即为所求的方法数。
C++实现
#include <iostream> #include <vector> using namespace std; const int MOD = 1000000007; const int N = 4500; int main() { int n, m; while (cin >> n >> m) { vector<int> dp(N + 1, 0); dp[0] = 1; for (int i = 1; i <= n; i++) { for (int j = i; j <= m; j++) { dp[j] = (dp[j] + dp[j - i]) % MOD; } } cout << dp[m] << endl; } return 0; }
代码说明
-
常量定义:
MOD = 1000000007
:用于取模,防止数值过大。N = 4500
:题目中和的最大值。
-
动态规划数组:
dp[j]
:表示将块蛋糕分配到若干盘子中的方法数。
-
双重循环:
- 外层循环遍历盘子数(从到)。
- 内层循环遍历蛋糕数(从到),更新的值。
-
输出结果:
- 直接输出,即所求的方法数。
- 1
信息
- ID
- 2015
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者