数字的拆分系列
# 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;
}
}

浙公网安备 33010602011771号