BZOJ 1042: [HAOI2008]硬幣購物 DP,與處理,容斥
Description
硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s
i的價值的東西。請問每次有多少種付款方法。
Input
第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s<=100000,tot<=1000
Output
每次的方法數
Sample Input
1 2 5 10 2
3 2 3 1 10
1000 2 2 2 900
Sample Output
4
27
解題方法: 容斥好題,首先不考慮數量限制,dp[i][j]表示點 i 種硬幣組成價值為 j 的物品的方案數,則有 dp[0][0]=0,dp[i][j]=dp[i
-1][j]+dp[i][j-c[i],最終答案就是 dp[4][n]。我們考慮個數限制,則答案應為任何一種都無限制的方案,減去
第一種硬幣個數超了的方案,減去第二種硬幣個數超了的方案,減去第三種硬幣個數超了的方案,減去第四種硬
幣個數超了的方案,加上第一種,第二種硬幣個數超了的方案,……,加上第一種,第二種,第三種,第四種硬
幣個數超了的方案,總之就是個容斥原理。我們考慮如何計算第一種硬幣個數超了的方案,設面值為 c,數量為
d,則我們必須要用第一種硬幣選出(d+1)×c 的價值,然後剩下的 n-(d+1)×c 隨便選,因此第一種硬幣個數超
了的方案就是 dp[4][n-(d+1)×c],剩下情況類似,這樣每次詢問的複雜度就做到了 O(1)。
程式碼如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int S = 100010;
#define rep(i, a, b) for(int i = a; i <= b; i++)
int c[5], d[5];
int n;
LL f[S], ans;
void dfs(int x, int k, int sum) //
{
if(sum < 0) return ;
if(x == 5){
if(k & 1) ans -= f[sum];
else ans += f[sum];
return ;
}
dfs(x + 1, k + 1, sum - (d[x] + 1) * c[x]);
dfs(x + 1, k, sum);
}
int main(){
scanf("%d%d%d%d%d", &c[1], &c[2], &c[3], &c[4], &n);
f[0] = 1;
rep(i, 1, 4){
rep(j, c[i], S - 1){
f[j] += f[j - c[i]];
}
}
rep(i, 1, n){
int x;
scanf("%d%d%d%d", &d[1], &d[2], &d[3], &d[4]);
scanf("%d", &x);
ans = 0;
dfs(1, 0, x);
printf("%lld\n", ans);
}
return 0;
}
相關文章
- bzoj1042: [HAOI2008]硬幣購物(Dp+容斥原理)
- 硬幣購物
- bzoj 3812: 主旋律 [容斥原理 狀壓DP]
- 拋硬幣(機率dp)
- [BZOJ4818][Sdoi2017][容斥原理][矩陣優化DP]序列計數矩陣優化
- bzoj 2655: calc [容斥原理 伯努利數]
- BZOJ1044: [HAOI2008]木棍分割(dp 單調佇列)佇列
- lg容斥與反演
- 容斥
- BZOJ 1044: [HAOI2008]木棍分割 DP,字首和優化,二分答案優化
- 容斥原理
- 反射容斥反射
- 【BZOJ 5003】與鏈 (多重揹包 dp)
- 購物車的實現及結算處理
- bzoj 3864: Hero meet devil [dp套dp]dev
- 修改購物項圖書數量的Ajax處理
- 【模板】容斥原理
- bzoj1853: [Scoi2010]幸運數字(容斥原理)
- 關於一些基礎的dp——硬幣的那些事(dp的基本引入)
- 容斥原理講解
- Min-Max 容斥
- 淺談批處理中的%cd%與%~dp0【轉】
- 遊戲裡面的容斥原理遊戲
- HDU 4455 Substrings(預處理+dp)
- BZOJ 1597 [Usaco2008 Mar]土地購買:斜率優化dp優化
- 分析:線上購物與支付
- 高併發處理思路與手段(一):擴容
- ASP.NET購物車的實現及結算處理原始碼ASP.NET原始碼
- BZOJ 1045: [HAOI2008] 糖果傳遞 數學,亂搞
- 容斥原理學習筆記筆記
- 容斥原理——數學知識
- #19. 計數(容斥原理)
- HDU 4059 The Boss on Mars ( 容斥原理)
- 阿里巴巴斥資千萬美元收購以色列創企Visualead,加強VRAR購物體驗阿里VR
- C#中的深度學習(二):預處理識別硬幣的資料集C#深度學習
- 容斥定理 AtCoder——FizzBuzz Sum Hard
- HDU4390Number Sequence(容斥原理)
- HDU4407Sum ( 容斥原理)