[BZOJ1042][HAOI2008]硬币购物[容斥原理+背包]

本文深入探讨了使用C++实现动态规划算法解决特定问题的方法。通过实例代码展示了如何利用数组进行状态转移,以及如何在循环中更新状态,达到求解复杂组合问题的目的。适合有一定C++基础并对算法优化感兴趣的读者。

这个比较详细

显然即可请别发题解

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[1000005], n;
int T, c[4], d[4], s;
 
int main(void){
    for (int i = 0; i < 4; ++i) cin >> c[i];
    f[0] = 1;
    for (int i = 0; i < 4; ++i) for (int j = c[i]; j <= 1000000; ++j) f[j] += f[j - c[i]];
    cin >> T;
    while (T--) {
        for (int i = 0; i < 4; ++i) scanf("%d", d+i); scanf("%d", &s);
        ll ans = 0;
        for (int i = 0; i < 16; ++i) {
            int cnt = 0, S = i, tmp = s;
            while (S) {
                int p = __builtin_ctz(S);
                tmp -= (d[p] + 1) * c[p];
                S -= 1 << p;
                ++cnt;
            }
            if (tmp >= 0) ans += ((cnt & 1) ? -1 : 1) * f[tmp];
        }
        cout << ans << endl;
    }
    return 0;
}

转载于:https://www.cnblogs.com/storz/p/10213383.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值