51nod 1597 有限揹包計數問題 dp

2021-08-07 04:30:56 字數 975 閱讀 5878

你有乙個大小為n的揹包,你有n種物品,第i種物品的大小為i,且有i個,求裝滿這個揹包的方案數有多少

兩種方案不同當且僅當存在至少乙個數i滿足第i種物品使用的數量不同

1<=n<=10^5,答案對23333333取模

設lim=sqrt(n),我們把所有物品按照大於lim和不大於lim分成兩部分。對於大於lim的部分,顯然每種物品是一定用不完的,且在這部分所選物品數量一定不會超過lim。

那麼我們可以對大於lim的部分進行dp,設g[i,j]表示我選了i種物品,和為j的方案數。轉移為g[i,j]=g[i-1,j-lim-1]+g[i,j-i]。

再對不大於lim的部分進行dp,設f[i,j]表示前i種物品中選了若干種其和為j的方案數。轉移的時候可以用類似單調佇列優化多重揹包的方法來優化。

最後統計答案即可,

時間複雜度o(

nn√)

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=100005;

const

int mod=23333333;

int n,lim,f[2][n],g[2][n],s[n];

int main()

f[0][0]=1;

now=0;

for (int i=1;i<=lim;i++)}}

int ans=0;

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

printf("%d",ans);

return

0;}

51nod1597 有限揹包計數問題

你有乙個大小為n的揹包,你有n種物品,第i種物品的大小為i,且有i個,求裝滿這個揹包的方案數有多少 兩種方案不同當且僅當存在至少乙個數i滿足第i種物品使用的數量不同 n 100000,答案模23333333,時限2.333s 這道題一看是一道多重揹包,但是範圍有點大啊。可以嘗試利用一下題目的條件,對...

51nod1597 有限揹包計數問題

51nod1597 有限揹包計數問題 試題描述 你有乙個大小為n的揹包,你有n種物品,第i種物品的大小為i,且有i個,求裝滿這個揹包的方案數有多少 兩種方案不同當且僅當存在至少乙個數i滿足第i種物品使用的數量不同 輸入 第一行乙個正整數n 1 n 10 5 輸出 乙個非負整數表示答案,你需要將答案對...

51Nod 1597 有限揹包計數問題

首先這是乙個多重揹包 但是它的資料非常特殊,我們可以利用其性質優化演算法 乙個顯然的優化是 當 i sqrt n 時,可以取消個數限制 設 f i j 表示選了 i 個物品,體積為 j 的方案數 一共有兩種轉移 可以由 i 1 個物品加上乙個最小的物品 sqrt n 1 可以由 i 個物品全部加一 ...