拼硬币

现有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;
}

 

posted @ 2019-02-25 10:18  strawqqhat  阅读(151)  评论(0编辑  收藏  举报
#home h1{ font-size:45px; } body{ background-image: url("放你的背景图链接"); background-position: initial; background-size: cover; background-repeat: no-repeat; background-attachment: fixed; background-origin: initial; background-clip: initial; height:100%; width:100%; } #home{ opacity:0.7; } .wall{ position: fixed; top: 0; left: 0; bottom: 0; right: 0; } div#midground{ background: url("https://i.postimg.cc/PP5GtGtM/midground.png"); z-index: -1; -webkit-animation: cc 200s linear infinite; -moz-animation: cc 200s linear infinite; -o-animation: cc 200s linear infinite; animation: cc 200s linear infinite; } div#foreground{ background: url("https://i.postimg.cc/z3jZZD1B/foreground.png"); z-index: -2; -webkit-animation: cc 253s linear infinite; -o-animation: cc 253s linear infinite; -moz-animation: cc 253s linear infinite; animation: cc 253s linear infinite; } div#top{ background: url("https://i.postimg.cc/PP5GtGtM/midground.png"); z-index: -4; -webkit-animation: da 200s linear infinite; -o-animation: da 200s linear infinite; animation: da 200s linear infinite; } @-webkit-keyframes cc { from{ background-position: 0 0; transform: translateY(10px); } to{ background-position: 600% 0; } } @-o-keyframes cc { from{ background-position: 0 0; transform: translateY(10px); } to{ background-position: 600% 0; } } @-moz-keyframes cc { from{ background-position: 0 0; transform: translateY(10px); } to{ background-position: 600% 0; } } @keyframes cc { 0%{ background-position: 0 0; } 100%{ background-position: 600% 0; } } @keyframes da { 0%{ background-position: 0 0; } 100%{ background-position: 0 600%; } } @-webkit-keyframes da { 0%{ background-position: 0 0; } 100%{ background-position: 0 600%; } } @-moz-keyframes da { 0%{ background-position: 0 0; } 100%{ background-position: 0 600%; } } @-ms-keyframes da { 0%{ background-position: 0 0; } 100%{ background-position: 0 600%; } }