P9425 [蓝桥杯 2022 国 B] 2022
1.试题 C :直线2.树形动态规划3.X 进制减法4.后缀表达式5.统计子矩阵6.包子凑数7.整数拼接8.地宫取宝9.七段码10.砝码称重11.递增三元组12.完全平方数13.[蓝桥杯 2019 省 A] 填空问题 E14.波动数列15.左孩子右兄弟16.接龙数列17.糖果18.蚂蚁感冒19.子串分值20.超级胶水21.P9425 [蓝桥杯 2023 国 B] AB 路线22.P9426 [蓝桥杯 2023 国 B] 抓娃娃
23.P9425 [蓝桥杯 2022 国 B] 2022
24.P8805 [蓝桥杯 2022 国 B] 机房25.P8806 [蓝桥杯 2022 国 B] 搬砖26.P8764 [蓝桥杯 2021 国 BC] 二进制问题一、题目描述
将 \(2022\) 拆分成 \(10\) 个互不相同的正整数之和,有多少种方案?
二、问题简析
令 \(dp[i][j]=\) \(i\) 的 \(j\) 划分的方案数(满足互不相同的正整数)。有两种实现方式:
- \(dp[i][j]\) 不含 \(1\)
在 \(dp[i-j][j]\) 的基础上,每个元素+1
。有 \(j\) 个元素,每个元素+1
,即 \((i-j)+1\times j=i\)。 - \(dp[i][j]\) 含 \(1\)
我们要找到一个不含 \(1\) 的dp
,且划分为 \(j-1\),在它的基础上添加元素 \(1\)。首先,\(i\) 中拿出一个 \(1\),变成 \(i-1\)。仿照上例,在一个dp
的基础上,每个元素都+1
,就得到了不含 \(1\) 的dp
。由 \((i-1)-1\times (j-1)=i-j\),得到 \(dp[i-j][j-1]\)。
综上所述,\(dp[i][j]=dp[i-j][j]+dp[i-j][j-1]\)。
三、代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k;
ll dp[2030][15]; // dp[i][j] -- i的j划分
int main()
{
#ifdef LOCAL
freopen("test.in", "r", stdin);
#endif
cin >> n >> k;
// 边界条件一:dp[0][1,2,...]=0
// ... // 不允许0存在,所以0的所有划分都为0
// 边界条件二:dp[1,2,...][1]=1
for (int i = 1; i <= n; ++i) // i的1划分,即自身
dp[i][1] = 1;
for (int i = 1; i <= n; ++i) // i=0已经在条件一中初始化
{
for (int j = 2; j <= k; ++j) // j=1已经在条件二中初始化
{
if (i >= j)
dp[i][j] = dp[i - j][j] + dp[i - j][j - 1];
// if i < j, dp[i][j] = 0 (因为不能有0存在)
}
}
cout << dp[n][k] << endl;
return 0;
}
完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具