1042: [haoi2008]硬幣購物
time limit:
10 sec memory limit: 162
mbsubmit:
2903 solved: 1785
[submit][status][discuss]
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 input12
51023
23110
100022
2900
sample output
427
dp預處理+容斥原理。以前沒寫過容斥原理,所以這裡寫下筆記吧。
若用乙個01串表示方案種類,第i位為1表示滿足d[i]條件,為0表示不滿足的話。
那麼,我們要求的即是1111。
顯然,就是 所有情況(至少有0個0的情況)-至少有乙個0的情況+至少有兩個0的情況...【減加減加】
即 ans=0個0=(0個0,1個0,2個0..)-(1個0,2個0,3個0..)+(2個0,3個0..)..
也就是說,減去所有至少偶奇數個0的情況,加上所有至少偶數個0的情況。
這個可以用dfs來做。
每一層即乙個位i,可以轉移到不受限制的情況(這一位0或1)或者(這一位0)的情況。分別不改顏色和改顏色。
也可以直接迴圈去列舉
我**寫的是迴圈去列舉要還是刪掉
還是太弱了qaq
1 #include 2**#define ll long long
3using
namespace
std;
4inline ll read()
7while(isdigit(ch))
8return x*f;9}
10 ll f[300010]={};
11int c[5],d[5
];12
namespace
zhangenming20}
21}22void
solve()
28 ll ans=0
;29 ll s=read();
30if(s>d[1]*c[1]+d[2]*c[2]+d[3]*c[3]+d[4]*c[4
])33 ans=f[s];
34for(ll i=1;i<=4;i++)
37for(ll i=1;i<=4;i++)41}
42for(ll i=1;i<=4;i++)47}
48}49if(s>=((d[1]+1)*c[1]+(d[2]+1)*c[2]+(d[3]+1)*c[3]+(d[4]+1)*c[4
]))52
53 printf("
%lld\n
",ans);54}
55}56}
57int
main()
BZOJ1042 HAOI2008 硬幣購物
description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s output 每次的方法...
bzoj1042 HAOI2008 硬幣購物
time limit 10 sec memory limit 162 mb submit 1835 solved 1074 submit status discuss 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s i的價值的東西...
bzoj1042 HAOI2008 硬幣購物
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 1000...