您的位置:首页 > 其它

自然数拆分(整数划分一)

2013-11-20 19:37 239 查看

Problem 36: 自然数拆分

Time Limit:1 Ms| Memory Limit:128 MB

Difficulty:2

Description

输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。

Input

输入只有一个整数n,表示待拆分的自然数n。 n<=80

Output

输出一个数,即所有方案数

Sample Input

7

Sample Output

14

Hint

解释:

输入7,则7拆分的结果是

7=1+6

7=1+1+5

7=1+1+1+4

7=1+1+1+1+3

7=1+1+1+1+1+2

7=1+1+1+1+1+1+1

7=1+1+1+2+2

7=1+1+2+3

7=1+2+4

7=1+2+2+2

7=1+3+3

7=2+5

7=2+2+3

7=3+4

一共有14种情况,所以输出14

思路:用temp[i][j] 表示i 划分成最大数为j的数相加的组合数, 求temp[i][j] 可分为三种情况:

1, i = 1或j = 1 时 temp[i][j] = 1 (将1分成n份或将n分成1份只有一种情况)

2,当i < j 时, temp[i][j]和temp[i][i]相同

3, 当i = j 时, temp[i][j] 比 temp[i][j-1] 多了 j 这一种组合

4, 当i > j 时, tmep[i][j] = temp[i][j-1](不含j的组合) + temp[i-j][j](含j的组合)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 500

int temp[MAX][MAX];

void fun()
{
int i, j;
for(i = 1; i < MAX; i++)
{
for(j = 1; j < MAX; j++)
{
if(i == 1 || j == 1)
{
temp[i][j] = 1;
}
else if(i < j)
{
temp[i][j] = temp[i][i];
}
else if(i == j)
{
temp[i][j] = temp[i][j-1] + 1;
}
else if(i > j)
{
temp[i][j] = temp[i][j-1] + temp[i-j][j];
}
}
}
}

int main()
{
fun();
int n, m;
scanf("%d", &n);
while(n--)
{
scanf("%d", &m);
printf("%d\n", temp[m][m] - 1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: