背包问题刷题

整数划分
一个正整数 n 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。
我们将这样的一种表示称为正整数 n 的一种划分。
现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。
输入格式
共一行,包含一个整数 n。
输出格式
共一行,包含一个整数,表示总划分数量。
由于答案可能很大,输出结果请对 109+7 取模。
分析:用f[i][j]
来表示状态,即用前i个数,刚好凑出j的所有情况,很明显每一个数的个数是不限量的,所以这是一个完全背包问题。我们要求的属性就是个数
直接用完全背包的状态转移,就是要么不选要么至少选一个f[i,j]
=f[i-1,j]
+f[i,j-i]
代码实现:
1 |
|
这里注意一下初始化,在求状态的时候要求所有状态都要已知,所以这里会涉及到的f[i][0]
要初始化
和完全背包一样的优化思路,将二维变成一维
1 |
|
- 标题: 背包问题刷题
- 作者: Tomfng
- 创建于 : 2025-07-24 17:23:00
- 更新于 : 2025-07-24 17:42:02
- 链接: https://redefine.ohevan.com/2025/07/24/算法刷题/背包问题刷题/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论