題目鏈結
此題在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 的結果。輸入格式 第...