揹包問題求方案數

2021-10-05 18:35:23 字數 1092 閱讀 3471

題目鏈結

此題在01揹包的基礎上,需要你求出最優選法的方案數

需要另開乙個陣列來記錄方案數。

此處需要注意,雖然是01揹包的另一種問法,但此題需要把dp[1…m]初始化為負無窮。這樣做的原因是,如果dp陣列全部初始化為0,那麼dp[k]的含義為容量為k時揹包裝的最大價值(注意此處不一定被裝滿了),那麼這樣就會造成重複計數的問題。若把dp[1…m]初始化為負無窮,那麼最大價值一定是從0開始轉移的,也就是說若dp[k]是最大價值,那麼一定裝滿了容量k。

#include #include const int n = 1e3 + 5;

const int mod = 1e9 + 7;

const int inf = int_min;

int dp[n];

int g[n];

int main()

}int ma = 0;

for (int i = 0; i <= m; ++i) ma = ma > dp[i] ? ma : dp[i];

int ans = 0;

for (int i = 0; i <= m; ++i)

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

return 0;

}

若不改變dp陣列的初始化方法,也可以改變方案計數陣列g的初始化方法。

dp[k]與g[k]互相對應

dp[k]的初始含義是用前0件物品,去裝容量為k的揹包,能獲得的最大價值。那麼肯定有一種裝法就是一件物品都不裝,價值為0,因此dp陣列全部初始化為0,g陣列全部初始化為1。再去做01揹包即可。

#include const int n = 1e3 + 5;

const int mod = 1e9 + 7;

int dp[n];

int g[n];

int main()

else if(dp[j]==dp[j-v]+w)}}

printf("%d\n", g[m]);

return 0;

}

揹包問題求方案數 揹包問題求具體方案

在01揹包的基礎上要求出最優解的方案數 具體的方案 揹包問題求方案數 題目鏈結 解題思路 我們可以設定乙個與陣列f功能類似的陣列g,其中f i 儲存的是體積等於i的最優解 這裡是等於,之前的部落格說的是小於等於,原因後面會說 而g i 儲存的是體積等於i時的最優解的方案數,而f i 為什麼儲存的是等...

揹包問題求方案數

有 n件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最優選法的方案數。注意答案可能很大,請輸出答案模 1e9 7 的結果。第一行兩個整數,n,v,用空格隔開,分別表示物品...

揹包問題求方案數

第二天叫醒我的不是鬧鐘,是夢想!有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出 最優選法的方案數。注意答案可能很大,請輸出答案模 109 7 的結果。輸入格式 第...