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