zoukankan      html  css  js  c++  java
  • POJ 3181 Dollar Dayz (完全背包,大数据运算)

    题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法?

      这题其实就相当于 UVA 674 Coin Change,求解一样
      只不过数据很大,需要用到高精度运算。。。

    后来还看了网上别人的解法,是将大数转化成高位和低位两部分处理

    代码一:用数组存储数据的每个位

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const int maxn=1005;
    long long dp[maxn][41];  //增加一维存储每一位的数
    int n,k;
    int main() {
    
        while(scanf("%d%d",&n,&k)!=EOF) {
            memset(dp,0,sizeof(dp));
            dp[0][1]=1;
            for(int i=1; i<=k; i++) {
                for(int j=i; j<maxn; j++) {
                    //原本就直接写了dp[j]+=dp[j-i],不WA才怪了。。。
                    for(int z=1;z<40;z++){
                        dp[j][z]=dp[j][z]+dp[j-i][z];
                        if(dp[j][z]>9){
                            dp[j][z]-=10;
                            dp[j][z+1]++;
                        }
                    }
                }
            }
            int idx=40;
            while(dp[n][idx]==0)
                idx--;
            for(int i=idx;i>=1;i--)
                printf("%d",dp[n][i]);
            printf("
    ");
        }
        return 0;
    }

    代码二:将大数分成两部分,高位部分和低位部分

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    
    using namespace std;
    const long long mod=10000000000000000;
    const int maxn=1005;
    long long dphigh[maxn];  //一个数的高位部分
    long long dplow[maxn];   //一个数的低位部分
    int n,k;
    int main() {
    
        while(scanf("%d%d",&n,&k)!=EOF) {
            memset(dphigh,0,sizeof(dphigh));
            memset(dplow,0,sizeof(dplow));
            dplow[0]=1;
            for(int i=1; i<=k; i++) {
                for(int j=i; j<maxn; j++) {
                    dphigh[j]+=dphigh[j-i];
                    dplow[j]+=dplow[j-i];
                    dphigh[j]+=(dplow[j])/mod;
                    dplow[j]=dplow[j]%mod;
                }
            }
            if(dphigh[n])
                printf("%I64d",dphigh[n]);
            printf("%I64d
    ",dplow[n]);
        }
        return 0;
    }
  • 相关阅读:
    Activiti 整合的小插曲
    IDEA 提示找不到 javax 等 tomcat 的相关包
    一些好用的 Oracle 批处理和语句
    Oracle 日志报错导致的 “没有登录” 问题
    WebPack 从安装到闲置
    CHENEY-YANG'S BLOG(cheney-yang)
    Java基础知识常识总结
    激活Navicat
    IDEA文件头版权模板
    关于Spring框架中StringUtils常用/易误用方法解析
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/3463941.html
Copyright © 2011-2022 走看看