递归-OpenJudge-7215:简单整数划分

来源:互联网 发布:java完整项目案例 编辑:程序博客网 时间:2024/05/25 18:12

简单的整数划分问题

总时间限制: 100ms 内存限制: 65536kB

描述

将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。

输入
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。
样例输入
5
样例输出
7
提示

5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1

解题方法:

1、阅读题意后,我们可以发现这明显是一道递归问题。那么解决这道题的关键是什么?

·按照提示保证在前面的数比它后面的数都大,避免发生像2+3;3+2;这样的重复计算。如此我们应该使用if语句进行判断。

#include<iostream>#include<cstdio>using namespace std;int ways = 1;void way(int nums[],int n, int i){int num[50];for(int k = 0; k < 50; k++){num[k] = nums[k];}num[n]--;num[i]++;if(num[n]<=0){return;}else{int temp = 1;for(int j = 0; j < i; j++){if(num[j] < num[j+1]){temp = 0;break;}}if(temp == 1){ways++;}way(num,n,i);way(num,i,i+1);}}int main(){int T;cin >> T;while(T--){int nums[50] = {0};cin >> nums[0];way(nums,0,1);cout << ways << endl;ways = 1;}return 0;}