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

2021-10-08 04:00:38 字數 2558 閱讀 2809

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