在01揹包的基礎上要求出最優解的方案數、具體的方案揹包問題求方案數(題目鏈結)
解題思路:
我們可以設定乙個與陣列f功能類似的陣列g,其中f[i]儲存的是體積等於i的最優解(這裡是等於,之前的部落格說的是小於等於,原因後面會說),而g[i]儲存的是體積等於i時的最優解的方案數,而f[i]為什麼儲存的是等於i的最優解的原因是這樣更有利於計算方案數(比如最優解的情況下,體積是4,但是揹包的容量是6,如果按小於等於來儲存結果,最後統計方案數的時候會把體積是5和6的也計算在內,導致重複計算,因為體積是5和6的最優解就是體積為4的最優解)。如果用f[i]儲存的是體積等於i的最優解,最後只要把最優解下不同體積的方案數進行求和就行了。
**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
1010
,mod =
1000000007
,inf =
1000000
;//g[i]儲存的是體積為i的最大方案數
int n,m,v,w,t,s,f[n]
,g[n]
;int
main()
}int maxn =
-inf,sum=0;
for(
int i=
0;i<=m;i++
)else
if(maxn==f[i]
) sum+
=g[i];}
cout
}
揹包問題求具體方案(題目鏈結)
解題思路:
首先我們要確定如何輸出其最優解的具體方案。可以這樣判斷,如果f[i][j]等於f[i-1][j] 則說明不選第i個物品,如果f[i][j]等於f[i-1][j-v[i]]+w[i] 則說明選第i個物品,通過這樣的判斷來得出完整的路徑。
由於題目要求輸出字典序最小的方案,所以我們應該以物體編號從小到大的順序輸出結果。
如果以正常順序計算最優解,然後再從後往前遍歷路徑的話,輸出的結果就不一定是字典序最小的了
正常順序的**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
1010
;int n,m,v[n]
,w[n]
,f[n]
[n];
vector<
int>v;
intmain()
}int vol = m;
for(
int i=n;i>=
1;i--)}
reverse
(v.begin()
,v.end()
);for(
auto vv:v)
return0;
}
結果:輸出
237247
283286
287291
299300
標準答案34
571011
167237
原因:
因為遍歷路徑的時候從後往前,所以是物品編號越大越優先,這樣輸出的結果會是編號遞增情況下字典序最大的結果。
修改:因此如果我們要字典序最小的結果,就應該反過來操作,計算最優解的時候從後往前,遍歷路徑的時候從前往後。
正確**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
1010
;int n,m,v[n]
,w[n]
,f[n]
[n];
intmain()
for(
int i=n;i>=
1;i--)}
int vol = m;
for(
int i=
1;i<=n;i++)}
return0;
}
有依賴的揹包問題(題目鏈結)
等我學了圖再來。。
揹包問題求具體方案
第二天叫醒我的不是鬧鐘,是夢想!有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出 字典序最小的方案。這裡的字典序是指 所選物品的編號所構成的序列。物品的編號範圍是 ...
揹包問題求方案數
有 n件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最優選法的方案數。注意答案可能很大,請輸出答案模 1e9 7 的結果。第一行兩個整數,n,v,用空格隔開,分別表示物品...
揹包問題求方案數
第二天叫醒我的不是鬧鐘,是夢想!有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出 最優選法的方案數。注意答案可能很大,請輸出答案模 109 7 的結果。輸入格式 第...