zoukankan      html  css  js  c++  java
  • 拼硬币

    现有n1+n2种面值的硬币,其中前n1种为普通币,可以取任意枚,后n2种为纪念币,每种最多只能取一枚,每种硬币有一个面值,问能用多少种方法拼出m的面值? 
    8 输入描述: 
    第一行三个整数n1, n2, m,分别表示普通币种类数,纪念币种类数和目标面值 
    第二行n1个整数,第i种普通币的面值a[i]。保证a[i]为严格升序。 
    第三行n2个整数,第i种纪念币的面值b[i]。保证b[i]为严格升序。 
    对于30%的测试,保证1<=n1+n2<=10,1<=m<=100,1<=a[i]<=100 1<=b[i]<=100 
    对于100%的测试,保证1<=n1+n2<=100, 1<=m<=100000, 1<=a[i]<=100000 1<=b[i]<=100000 
    输出描述: 
    输出一行,包含一个数字x,表示方法总数对1000000007(1e9+7)取模的结果。 
    注意:不要忘记取模! 
    示例1 
    输入 
    3 1 5 
    1 2 3 

    输出 

    说明 
    (x)代表面值为x的普通币,[x]代表面值为x的纪念币,样例所有方法数如下: 
    (1)(1)(1)(1)(1) 
    (1)(1)(1)(2) 
    (1)(1)(3) 
    (1)(2)(2) 
    (2)(3) 
    (1)(1)(1)(1)[1] 
    (1)(1)1 
    (1)1 
    1(2) 
    备注: 
    两个方法,它们任意一种或以上的硬币数量不同,则认为是两种拼法。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=110,M=10010,MOD=1000000007;
    int n1,n2,m;
    int a[N],b[N],f[M];
    
    int main()
    {
        cin>>n1>>n2>>m;
        for(int i=0;i<n1;i++) cin>>a[i];
        for(int i=0;i<n2;i++) cin>>b[i];
        f[0]=1;
        for(int i=0;i<n1;i++){
            for(int j=a[i];j<=m;j++){
                f[j]+=f[j-a[i]];
                if(f[j]>=MOD) f[j]-=MOD;
            }
        }
        for(int i=0;i<n2;i++){
            for(int j=m;j>=b[i];j--){
                f[j]+=f[j-b[i]];
                if(f[j]>=MOD)
                    f[j]-=MOD;
            }
        }
        cout<<f[m]<<endl;
        return 0;
    }
    
  • 相关阅读:
    mysql导出存储过程、函数、视图、触发器
    通过mk-table-checksum与pt-table-sync检查不同库两张表的一致性。
    Linux内核OOM机制的详细分析
    Linux虚拟内存(VM)相关参数解析
    mysqld异常重启后,自动启动应用srm进程
    利用python多线程执行远程linux上命令
    oracle数据库时常用的操作命令
    Oralce_DDL
    Oralce_PL_SQL
    mysqlbackup备份和还原
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602253.html
Copyright © 2011-2022 走看看