HAOI2008 硬幣購物

2021-10-09 18:34:58 字數 1244 閱讀 4567

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

題目描述

硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。

輸入描述:

第一行c1,c2,c3,c4,tot

下面tot行d1,d2,d3,d4,s,其中di,s ≤ 100000,tot ≤ 1000

輸出描述:

每次的方法數

示例1輸入

複製1 2 5 10 2

3 2 3 1 10

1000 2 2 2 900

輸出複製427

這個題我第一眼的思路是貪心,但是發現情況太多了,導致複雜度很高,無法實現,可能還是太菜了,之後的思路才是用動態規劃,但是普通的揹包dp複雜度會高達o(4stot),明顯會超時,於是看了大神的題解,了解到了容斥,我們可以先用dp將所有情況求出來,也就是此時先忽視di的限制,**如下

for

(int i=

0;i<

4;i++

)}

之後只用把不可能的情況排除就行了,之所以會有不存在的情況就是因為di的限制,當ci的數量達到di+1便捨去,但是此時,由於捨掉了4種di,導致會重複捨去,比如d2捨去d2+1之後的,也捨去了包括了d2和d3同時存在的情況,但是d3也會捨去這部分,於是用到了容斥,由於是通過所有情況反推,所以是奇減偶加,和容斥一般情況正好相反,上**

#include

#define max 100005

long

long dp[max]

;int c[4]

;int d[4]

;int

main()

}scanf

("%d"

,&tot)

;while

(tot--

)scanf

("%d"

,&s)

; ans=dp[s]

;for

(int i=

1;i<

1<<

4;i++)}

if(all<=s)

else}}

printf

("%lld\n"

,ans);}

}

HAOI 2008 硬幣購物

硬幣購物一共有 4 44 種硬幣。面值分別為 c1,c2,c 3,c4 c 1,c 2,c 3,c 4 c1 c2 c3 c4 某人去商店買東西,去了 tot totto t 次。每次帶 dij d di j 枚 cij c ci j 硬幣,買 s is i si 的價值的東西。請問每次有多少種付款...

HAOI2008 硬幣購物

硬幣購物一共有 4 種硬幣。面值分別為 c 1,c 2,c 3,c 4 某人去商店買東西,去了 tot 次。每次帶 d i 枚 c i 硬幣,買 s i 的價值的東西。請問每次有多少種付款方法。好的,比較欣喜的一點是我們如果不考慮什麼帶了 k i 個,那麼其實就是乙個完全揹包是不是 但是他有乙個特別...

HAOI2008 硬幣購物

題面在這裡 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。d i,s le 100000,t le 1000 使用單調佇列優化多重揹包十分開心地獲得了20分的好成績 o 4ts 為什麼我就...