• 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)<<"
    ";
        }
        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个篮子中有多少种方法。这是递归的第三种用法,但我总是不得要领,无法准确的抓住子问题
  • 相关阅读:
    巧用table的rules属性设置表格的边框掩饰。。。
    JS日期和时间
    onchange事件验证文本框格式,不正确光标返回原文本框,这个js怎么写?
    简易万用表
    在单片机中的空函数
    地感线圈的讲究
    全桥片
    这个当单片机程序怎么会不停的通过串口发数据,设置波特率为9600,但是串口软件接受数据不对(初学者,请高手指教)
    今天开博
    关于二极管
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9112941.html
Copyright © 2020-2023  润新知