LOJ6089 小Y的揹包計數問題(動態規劃)

2022-03-20 04:08:23 字數 917 閱讀 5563

loj

神仙題啊。

我們分開考慮不同的物品,按照編號與\(\sqrt n\)的關係分類。

第一類:\(i\le \sqrt n\)

即需要考慮所有的情況,那麼設\(f[i][j]\)表示前\(i\)個物品裝了體積\(j\)的方案數。

顯然\(f[i][j]=\sum_^i f[i][j-k*i]\)轉移過來,那麼按照\(i\)分剩餘類,字首和轉移即可。

這一部分的複雜度是\(o(n\sqrt n)\)

第二類:\(i\ge \sqrt n\)

因為\(i*i\ge n\),所以這一部分的任何乙個物品都不存在個數的限制,即可以隨意選擇。

那麼我們只需要用所有大於\(\sqrt n\)的數做整數劃分就行了。

設\(g[i][j]\)表示當前一共劃分出來了\(i\)個數,和為\(j\)的方案數,每次要麼加入乙個\(\sqrt n\),要麼把所有數\(+1\)。

這一部分因為數的共個數,即\(i\)不會超過\(\sqrt n\),所以總的複雜度也是\(o(n\sqrt n)\)的。

那麼這題的總複雜度就是\(o(n\sqrt n)\)了。

#include#include#includeusing namespace std;

#define ll long long

#define mod 23333333

#define max 100100

int n,m,ans;

int f[350][max],g[350][max],s[max];

int main()

for(int i=0;i<=n;++i)ans=(ans+1ll*s[n-i]*f[m][i])%mod;

printf("%d\n",ans);

return 0;

}

LOJ6089 小 Y 的揹包計數問題

傳送門 to loj 不妨分成兩部分討論 x nx sqrt x和 x n x ge sqrt n x n 為啥要這麼分啊?這確實很難說。但是我們可以猜到,我們在讓這兩個值拿到平衡 值的種類和最多選取的個數。當值的種類很少時,直接多重揹包就行了。當選取的種類很少時呢?用 f x i f x,i f ...

loj6089 小 Y 的揹包計數問題

link 好吧開學了果然忙得要死 不過為了證明我的blog還沒有涼,還是跑來更一波水題 有n種物品,第i種體積為i,問裝滿乙個大小為n的揹包有多少種方案?n leq 10 5.這種題一看就很想按根號分類是不是 設閾值大小為 m sqrt n 對於體積 leq m 的所有物品,直接跑多重揹包 f i ...

loj6089 小Y的揹包計數問題

小 y 有乙個大小為 n 的揹包,並且小 y 有 n 種物品。對於第 i 種物品,共有 i 個可以使用,並且對於每乙個 i 物品,體積均為 i 求小 y 把該揹包裝滿的方案數為多少,答案對於 23333333 取模。定義兩種不同的方案為 當且僅當至少存在一種物品的使用數量不同。這個揹包問題讓我耳目一...