zoukankan      html  css  js  c++  java
  • 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个篮子中有多少种方法。这是递归的第三种用法,但我总是不得要领,无法准确的抓住子问题
  • 相关阅读:
    Tomcat 服务器体系结构
    tomcat的下载和启动
    tomcat解决端口号占用问题
    我的wmware
    Xshell的使用
    GCC的-wl,-rpath=参数
    Matlab图像处理(01)-Matlab基础
    CMake最好的学习资料
    使用valgrind进行内存泄漏和非法内存操作检测
    CLion提示can't find stdio.h等错误
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9112941.html
Copyright © 2011-2022 走看看