BZOJ 1042 HAOI2008 硬幣購物

2022-08-16 17:15:23 字數 1705 閱讀 1825

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...