数字的拆分系列
# Description
将数字N分成2份以上.使用的数字不可重复.例如5=1+4=2+3,就只有两种拆分的方式.
# Format
## Input
每一行给出一个数字N
3<=N<=500
整个测试以0代表结束.
## Output
输出有多行,每行一个数字,代表拆分的种数
# Samples
```input1
3
5
0
```
```output1
1
2
```
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <bits/stdc++.h> using namespace std; long long f[555][555]; int num; long long dfs( int n, int m) { // cout<<n<<" "<<m<<endl; if (m==0&&n==0) return 1; if (m==0) return 0; // if (n==1&&m==1) // return 1; if (f[n][m]) return f[n][m]; if (m*(m+1)/2<n) //必须加上这个剪枝才能过 return 0; long long a=dfs(n,m-1); long long b=0; if (n>=m) b=dfs(n-m,m-1); f[n][m]=a+b; return f[n][m]; } int main() { while ( true ) { cin>>num; if (num==0) break ; cout<<dfs(num,num-1)<<endl; } } |
P07255. 数字的拆分之二
Description
将数字N进行拆分.拆分出来的数字可以重复使用.
Format
Input
每一行给出一个数字N,3<=N<=500.整个测试以0代表结束.
Output
拆分的种数.
Samples
输入数据 1
3
0
输出数据 1
3
说明: 3=3,3=1+1+1,3=1+2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <bits/stdc++.h> using namespace std; long long f[555][555]; int num; long long dfs( int n, int m) { // cout<<n<<" "<<m<<endl; if (n==0) return 1; if (m==1) return 1; if (f[n][m]) return f[n][m]; long long a=dfs(n,m-1); long long b=0; if (n-m>=0) b=dfs(n-m,m); f[n][m]=a+b; return f[n][m]; } int main() { while ( true ) { cin>>num; if (num==0) break ; cout<<dfs(num,num)<<endl; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现