数字的拆分系列



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

  

posted @ 2023-08-17 10:58  我微笑不代表我快乐  阅读(125)  评论(0编辑  收藏  举报