時間限制: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 為什麼我就...