数字的拆分系列
# Description
将数字N分成2份以上.使用的数字不可重复.例如5=1+4=2+3,就只有两种拆分的方式.
# Format
## Input
每一行给出一个数字N
3<=N<=500
整个测试以0代表结束.
## Output
输出有多行,每行一个数字,代表拆分的种数
# Samples
```input1
3
5
0
```
```output1
1
2
```
#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。
#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; } }