背包方案数DP

有两种货币。n1种货币每种任意取,n2种货币每种只能取1个。求组合成m的方案数。

#include <bits/stdc++.h>

using namespace std;
const int N = 1E5 + 7;
const int MOD = 1E9 + 7;
typedef long long ll;
int dp1[N];
int dp2[N];
int n1, n2, m;
int a1[N], a2[N];

int main()
{
    while(scanf("%d %d %d", &n1, &n2, &m) == 3) {
        memset(dp1, 0, sizeof(dp1));
        memset(dp2, 0, sizeof(dp2));
        for(int i = 1;i <= n1;i ++) scanf("%d", &a1[i]);
        for(int i = 1;i <= n2;i ++) scanf("%d", &a2[i]);
        dp1[0] = dp2[0] = 1;
        for(int i = 1;i <= n1;i ++) {
            for(int t = a1[i];t <= m;t ++) {
                dp1[t] += dp1[t-a1[i]];
                if(dp1[t] >= MOD) dp1[t] %= MOD;
            }
        }
        for(int i = 1;i <= n2;i ++) {
            for(int t = m;t >= a2[i];t --) {
                dp2[t] += dp2[t-a2[i]];
                if(dp2[t] >= MOD) dp2[t] %= MOD;
            }
        }
        ll res = 0;
        for(int i = 0;i <= m;i ++) {
            res += (dp1[i]*1LL*dp2[m-i] % MOD);
            res %= MOD;
        }
        printf("%lld\n", res);
    }
    return 0;
}


阅读更多
个人分类: 背包 DP
想对作者说点什么? 我来说一句

dp 背包讲解 动态规划优化

2011年08月30日 286KB 下载

没有更多推荐了,返回首页

不良信息举报

背包方案数DP

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭