HAOI2008 硬幣購物

2022-05-08 06:00:07 字數 2504 閱讀 7500

題面在這裡

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

\[d_i,s\le 100000,t\le 1000

\]使用單調佇列優化多重揹包十分開心地獲得了20分的好成績

\(o(4ts)\)為什麼我就不過呢?

觀察資料,物品數量\(=4\),考慮對於物品數量的指數級演算法,容斥

如果沒有物品數量的限制,那麼此題變成了乙個完全揹包問題,直接求解即可

現在的關鍵是物品的數量有限制,因此考慮如何去掉物品數量過多的一部分

考慮把總容量減去單件物品目前能夠達到的最大容量(即\(s-d_i\times c_i\)),對剩下的空間做完全揹包,

我們能夠從這個方案數中得到仍然含有這個物品的方案數(使用\(f[s][t]\)中\(t\)的二進位制位表示物品狀況),

那麼這個方案應該會等於開始的揹包中這件物品數量過多的方案。

我們使用總數-不合法,就會得到這件物品不超過\(d_i\)的方案數

接下來考慮有兩種物品同時超過的情況

如果我們僅僅使用剛才的演算法計算出\(f[0][s]-\sum_^f[2^][s-c_i\times d_i]\),

那麼一種有兩種物品同時超過的方案會被減去計算兩次,加上即可

同理,減去三種物品同時超過的方案,加上四種物品同時超過的方案,我們就得到了我們要求的東西。

綜上,我們得到了乙個\(o(2^k\times s+2^\times tot)\)(\(k\)代表物品數量)的演算法,

可以通過本題。

多重揹包(娛樂向)的**

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define file "a"

#define mp make_pair

#define pb push_back

#define rg register

#define il inline

using namespace std;

typedef unsigned long long ull;

typedef vectorvi;

typedef long long ll;

typedef double dd;

const dd eps=1e-10;

const int mod=1e9+7;

const int n=3010;

const dd pi=acos(-1);

const int inf=2147483647;

il ll read()

il void file()

ll c[5],d[5],f[100010];

queueq;

il ll dp(ll v)

for(rg ll k=(v-j)/c[i]*c[i]+j;k>=0;k-=c[i])

f[k]=sum;sum-=ret;q.pop();

}} }

return f[v];

}int main()

return 0;

}

\(ac\)**

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define file "a"

#define mp make_pair

#define pb push_back

#define rg register

#define il inline

using namespace std;

typedef unsigned long long ull;

typedef vectorvi;

typedef long long ll;

typedef double dd;

const dd eps=1e-10;

const int mod=1e9+7;

const int n=3010;

const dd pi=acos(-1);

const int inf=2147483647;

il ll read()

il void file()

ll c[5],d[5];

ll f[16][100010];

il void update(ll &a,ll b)

il void init()

il ll dp(ll v)

}return sum;

}int main()

return 0;

}

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 硬幣購物

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方...

HAOI2008 硬幣購物

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