BZOJ 1042 HAOI2008 硬幣購物

2022-03-18 04:19:48 字數 813 閱讀 3432

題鏈:

題解:

容斥原理,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...