Luogu-P1450 [HAOI2008]硬币购物-完全背包+容斥定理 [Problem Description] 略 [Solution] 上述题目等价于:有\(4\)种物品,每种物品有\(d_i\)个,且每种物品的体积为\(c_i\),问有多少种方法装满容量为\(s\)的背包?可以很容易想到跑多重背包即可,但是发现复杂度为\(O(4V\cdot n)\).不可行. 题目要求的东西也等价于求以下等式有多少组满足条件的解: \[ c_1\cdot x_1+c_2\cdot x_2+c_3\cd…
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s3+s4)+(s12+s13+s14+s23+s24+s34)-(s123+s124+s134+s234)+s1234 其中s...为某硬币超过限制的方案数 求s的方法: 如s1:硬币1超过限制,就是硬币1至少选了num1+1个,其他随便,所以s1=dp[V-c1*(num1+1)] 同理s12 = dp…
题意:硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 思路:这么老的题,居然今天才做到...背包的复杂度是比较高的. 加上tot次询问会爆炸.能不能预处理,然后容斥得到答案呢?      先求一个完全背包,求出方案数,dp[].      然后对于具体的询问,减去不合法的情况 .      对于c[i],它发贡献是dp[S-c[i]*(d[i]+1)];      那么会重复减,所以又…
1600+人过的题排#32还不错嘿嘿 浴谷夏令营讲过的题,居然1A了 预处理出f[i]表示购买价值为i的东西的方案数 然后每次询问进行一次容斥,答案为总方案数-第一种硬币超限方案-第二种超限方案-第三种超限方案-第四种超限方案+第一种和第二种硬币超限方案+... 第i种硬币超限方案就是f[s-c[i]*(d[i]+1)],其他的类推一下就行了 #include<iostream> #include<cstring> #include<cstdlib> #include&…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1042 题目概括 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 题解 一开始没看数据范围,觉得是类似状压的dp. 然后看了看数据范围,懵逼了. 然后发现可以写容斥! 我们先当作完全背包,不考虑限制,把花费每种价格的方案数弄出来. 然后容斥一下就可以了. 具体容斥:所有情况 - 第一种货…
题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案. 为了避免重复的方案被转移,所以我们以硬币种类为第一层循环,这样阶段性的增加硬币. 一定要注意这个第一层循环要是硬币种类,并且初始 f[0] = 1. f[0] = 1; for (int i = 1; i <= 4; ++i) { for (int j = B[i]; j <= MaxS; +…
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2924  Solved: 1802 [Submit][Status][Discuss] Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s i的价值的东西.请问每次有多少种付款方法. Input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,…
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. Input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s<=100000,tot<=100 Output 每次的方法数 Sample Input 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 Sample Output 4 27 Sol…
传送门 题意简述:有四种面值的硬币,现在qqq次询问(q≤1000)(q\le1000)(q≤1000),每次给出四种硬币的使用上限问最后刚好凑出sss块钱的方案数(s≤100000)(s\le100000)(s≤100000). 思路:先跑完全背包预处理出所有硬币都无限制时候的答案. 然后每次询问的时候枚举容斥掉多算的情况即可. 代码: #include<bits/stdc++.h> using namespace std; long long tot,c[5],d[5],s,dp[1000…
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define maxn 100005 #define maxk 16 ],tot,n,d[],num[maxk]; typedef long long ll; ll f[maxn],ans; void read(in…