11 揹包問題求方案數

2021-10-22 20:50:42 字數 1245 閱讀 5419

有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。

第 ii 件物品的體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。

輸出最優選法的方案數。注意答案可能很大,請輸出答案模 109+7 的結果。

輸入格式

第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。

接下來有 n 行,每行兩個整數 vi,wi用空格隔開,分別表示第 i 件物品的體積和價值。

輸出格式

輸出乙個整數,表示方案數模 109+7 的結果。

資料範圍

0輸入樣例

4 5

1 22 4

3 44 6

輸出樣例:

2
解題思路:

cnt[j] 表示 最大容量空間為 j 的時候,能夠達到最大價值的方案數目

f[j]   表示 最大容量空間為 j 的時候,能夠達到的最大價值是

* 1.如果 f[j] > f[j-v]+w  表示在該次變化中,f[j]的最大價值來自於  前面的物品的 價值

*   這個時候更新 cnt[j] = cnt[j]  即當遇到當前物品的時候,這個東西不將該標

* 2.如果 f[j] == f[j-v]+w   表示在遇到乙個新物品的時候,能夠有兩種方式使得達到最大**,這個時候

*   更新 cnt[j] = cnt[j]+cnt[j-v]  即有多種方法到達最大價值。

* 3.f[j] < f[j-v]+w   cnt[j]=cnt[j-v]

#includeusing namespace std;

int dp[1001], res[1001];

int weight[1001] = ;

int value[1001] = ;

int mod = 1e9 + 7;

int main()

fill(dp, dp + 1001, 0);

fill(res, res + 1001, 1);

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

else if (dp[j] < dp[j - weight[i]] + value[i])

} }cout << res[v];

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 的結果。輸入格式 第...