数字的拆分系列



# 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;
}
}

  

posted @   我微笑不代表我快乐  阅读(215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示