• [JOYOI] 自然数拆分Lunatic版


    题目背景
    话说小小鱼看了P1171(自然数拆分)之后感觉异常不爽,于是异常邪恶地将题目加强。
    
    题目描述
    输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。
    
    输入格式
    输入只有一个整数n,表示待拆分的自然数n0<n<=4000
    PS:0也算自然数,所以这里应该写正整数比较好
    但是为了尊重原作者的版权(这有版权吗- -),没有改掉。
    本来n是要到5000的,但是开到5000的话我的程序就Memory Limit Exceeded了。。
    
    输出格式
    输出一个数,即所有方案数
    因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。
    
    提示
    解释:
    输入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 mod 2147483648,即14小小鱼加强AdminP1171
    PS:虽说加强了,但是好像还是很简单。。。
    
    样例数据
    输入样例 #1 输出样例 #1
    7
    14
    

    完全背包,物品数字,容量n。

    //Stay foolish,stay hungry,stay young,stay simple
    #include<iostream>
    #include<cstdio>
    #include<cctype>
    using namespace std;
    
    const int MAXN=5005;
    const long long MOD=2147483648; 
    inline int rd(){
        int ret=0,f=1;char c;
        while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
        while(isdigit(c)){
            ret=ret*10+c-'0';
            c=getchar();
        }
        return ret*f;
    }
    
    long long f[MAXN],a[MAXN];
    int n,m; 
    
    
    int main(){
        n=rd();
        f[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                f[j]=(f[j]+f[j-i])%MOD;
            }
        }
        cout<<(f[n]>0?f[n]-1:MOD-1)<<endl;
        return 0;
    }
    

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247428.html

  • 相关阅读:
    【转载】阿里云轻量应用型服务器和ECS服务器比较
    Android -- 启动模式
    Android -- Broadcast接收
    Qt正则表达式提取数据
    Android -- Intent
    Android -- 多线程下载
    Android -- ContentProvider与联系人
    Android -- 内容观察者
    Android -- ContentProvider
    Android -- ListView与ArrayAdapter、SimpleAdapter
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9247428.html
Copyright © 2020-2023  润新知