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