自然数拆分(整数划分一)
2013-11-20 19:37
239 查看
Problem 36: 自然数拆分
Time Limit:1 Ms| Memory Limit:128 MBDifficulty:2
Description
输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。Input
输入只有一个整数n,表示待拆分的自然数n。 n<=80Output
输出一个数,即所有方案数Sample Input
7Sample Output
14Hint
解释:输入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; }
相关文章推荐
- 整数划分,性质一的疑惑,n拆分成k个数
- 整数划分/拆分--C++
- 【例题】【递归/推】NKOJ 3527数的划分&3526 放苹果&3131自然数的拆分
- 一个关于把集合拆分的有意思的小题目(将1到N的连续整数组成的集合划分成两个子集合)
- JAVA代码—算法基础:整数拆分求最大乘积问题
- 区间DP——整数划分(使乘积最大)
- 简单整数划分(递归法+动态规划法)
- OpenJudge简单的整数划分问题两种方法(DFS)(动态规划0ms),全局题号7215,已AC
- C++ 求解一整数划分问题
- 整数划分
- nyoj746 整数划分(四)
- 整数划分并输出(DFS)
- 整数划分问题--递归求解 例题:HDU 1028
- 整数划分
- 【51Nod 1201】 整数划分
- 一个无序自然数序列有N个自然数,快速找到二者之和为M的两个整数并输出
- nyoj746整数划分(四)
- 整数的划分
- 程序设计:划分整数(计蒜客)(dp)
- 三数组合为一大整数且这一大数又能拆分成这三个数---算法实现