題鏈:
題解:
容斥原理,dp預處理
首先跑個無限物品的揹包dp求出dp[i]表示在四種物品都有無限個情況下有多少種方法支付 i元。
然後對於每個詢問,答案就是 dp[s]-不合法的方法。
那麼這個不合法的方法數怎麼求呢?
舉個例子:如果 c1不能超過d1個的話,那麼我們就強制用掉 d1+1個 c1硬幣,
那麼dp[s-(d1+1)*c1]就是c1不合法的方法數。
所以這樣就可以類似的求出其它硬幣的不合法的方法數,以及某幾種硬幣都不合法的方法數,用於容斥計算。
即 ans=dp[s] - 一種硬幣不合法 + 兩種硬幣不合法 -三種硬幣不合法 +四種硬幣不合法。
dfs實現
**:
#include#include#include#define maxn 105000#define ll long long
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
ll dp[maxn],c[10],d[10];
ll tot,ans,s;
void dfs(int p,int num,ll de)
int main()
scanf("%lld",&tot);
while(tot--)
return 0;
}
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...