006:简单的整数划分问题

描述

将正整数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

WA:

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
using namespace std;
int countNum(int n)
{
    if(n==1)return 1;
    if(n==2)return 1;
    int l=n/2;
    int result=0;
    for(int i=n-1;i>=l;i--){
        result+=countNum(i);
    }
    return result;
}
int main()
{
    freopen("in.txt","r",stdin);
    int n;
    while(cin>>n){
        cout<<countNum(n)<<"\n";
    }
    return 0;
}

AC:

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
using namespace std;
///其实问题的本质是n个苹果放到m个篮子中有多少种方法
int countNum(int n,int m)
{
    if(n==0)return 1;
    if(m==0)return 0;
    if(n>=m){
        return countNum(n,m-1)+countNum(n-m,m);
    }
    return countNum(n,m-1);
}
int main()
{
//    freopen("in.txt","r",stdin);
    int n;
    while(cin>>n){
        cout<<countNum(n,n)<<endl;
    }
    return 0;
}
其实问题的本质是n个苹果放到m个篮子中有多少种方法。这是递归的第三种用法,但我总是不得要领,无法准确的抓住子问题
posted @ 2018-05-30 19:45  MalcolmMeng  阅读(318)  评论(0编辑  收藏  举报