1042 HAOI2008 硬幣購物

2022-05-12 09:52:29 字數 1444 閱讀 3652

硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s

i的價值的東西。請問每次有多少種付款方法。

第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s<=100000,tot<=1000

每次的方法數

1 2 5 10 2

3 2 3 1 10

1000 2 2 2 900427

我們可以先不要求硬幣的個數,求一下揹包。。。

然後我們用一下容斥原理。。。

對於s,我們如果不限制則是f[s]種方案。。

如果第一種硬幣放多了也能達到s,則是f[s-(d1+1)*s1]

同理,可以求出第二種到第四種。。。

然後我們會發現我們減多了。。

所以要加上,第一種和第二種都放多了的情況。。。

同理。。。

然後我們又發現我們又加多了。。

所以要減去第一種,第二種,第三種都放多的情況。。

同理。。。

最後我們又發現我們減多了。。。

所以再加上四種硬幣都放多的情況。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include

12#define inf 1000000000

13#define maxn 100000+5

14#define maxm 10000+5

15#define eps 1e-10

16#define ll long long

17#define for0(i,n) for(int i=0;i<=(n);i++)

18#define for1(i,n) for(int i=1;i<=(n);i++)

19#define for2(i,x,y) for(int i=(x);i<=(y);i++)

20#define for3(i,x,y) for(int i=(x);i>=(y);i--)

21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

22using

namespace

std;

23int

read()

26while(ch>='

0'&&ch<='9')

27return x*f;28}

29int a[5],d[5

];30

ll f[maxn],ans;

31 ll find(int

a)35

intmain()

63return0;

64 }

view code

1042 HAOI2008 硬幣購物

time limit 10 sec memory limit 162 mb submit 1534 solved 897 submit status discuss 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請...

1042 HAOI2008 硬幣購物

題目鏈結 題目大意 共有4種硬幣,面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s的價值的東西。請問每次有多少種付款方法 題解 容斥原理設f i 為 不考慮數 量限制時 得到面值 i的方案 數 完全 揹包 由容斥原理,a ns 價 值為s時 的方案數 超過...

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 每次的方法...