bzoj1042 HAOI2008 硬幣購物

2021-07-12 02:53:13 字數 1150 閱讀 5204

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的價值的東西。請問每次有多少種付款方法。

第一行 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

容斥原理+揹包

,思路好題

用完全揹包可以求出f[i],表示不限定硬幣數量,組成i的方案數。

直接求不好求,可以運用補集思想,ans=不限定硬幣的方案數-有硬幣超出的方案數。

那有硬幣超出的方案數sum怎麼求呢?

根據容斥原理有:sum=至少一種超出的方案數-至少兩種超出的方案數+至少三種超出的方案數-全部超出的方案數。

然後對於每一步,某幾種硬幣至少超出限定數量,也就是至少有d[i]+1個,剩餘的價值rest=s-∑(c[i]*(d[i]+1)),方案數即為f[rest],f陣列已經用完全揹包預處理了。

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 100005

using namespace std;

int tot,n,c[10],d[10];

ll ans,f[maxn];

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}ll get(int x1=0,int x2=0,int x3=0,int x4=0)

int 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 硬幣購物

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

BZOJ1042 HAOI2008 硬幣購物

硬幣購物一共有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 每次的方法數...