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