動態規劃 回溯法實現0 1揹包

2021-10-04 18:31:56 字數 3480 閱讀 3636

v(i, j)表示在前i(1≤i≤n)個物品中能夠裝入容量為j(1≤j≤c)的揹包中的物品的最大值

v(i, 0)= v(0, j)=0 (式1)

式2:

式1表明:把前面i個物品裝入容量為0的揹包和把0個物品裝入容量為j的揹包,得到的價值均為0

式2的第乙個式子表明:如果第i個物品的重量大於揹包的容量,則物品i不能裝入揹包,則裝入前i個物品得到的最大價值和裝入前i-1個物品得到的最大價值是相同的

第二個式子表明:如果第i個物品的重量小於揹包的容量,則會有以下兩種情況:

①如果第i個物品沒有裝入揹包,則揹包中物品的價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。

②如果把第i個物品裝入揹包,則揹包中物品的價值等於把前i-1個物品裝入容量為j-wi的揹包中的價值加上第i個物品的價值vi;

x[i]:記錄所選擇的物品

int w[100]; //記錄物品重要的陣列

int v[100]; //記錄物品價值的陣列

int c=10; //揹包容量

int v[100][100];

int x[100];

int main()

for(int j=0;j<=c;j++)

for(int i=1;i<=n;i++)else

} }int j=c;

for(int i=n;i>0;i--)else x[i]=0;

} cout << v[n][c] << endl;

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

return 0;

}改進:

#include#include#include#include#define maxn 1000000000

using namespace std;

int *w; //w[i] 物品i的重量

int *v; //v[i] 物品i的價值

int *x; //x[i]=0 表示第i個物品未放入; x[i]=1 表示第i個物品放入

int main()

} }int j=c;

for(int i=n;i>0;i--)else x[i]=0;

} cout << v[n][c] << endl;

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

return 0;

}

python**

"""

樣例輸入

5 10 #5代表物品總數 10代表揹包總重量

2 6 #2代表重量,6代表價值

2 36 5

5 44 6

樣例輸出

151 2 5

"""n,c =

map(

int,

input()

.split())

weight =[0

]*(n +1)

value =[0

]*(n +1)

for i in

range

(n):

weight[i+1]

,value[i+1]

=map

(int

,input()

.split())

v =[[0

]*(c+1

)for i in

range

(n+1)]

for i in

range(1

,n+1):

for j in

range(1

,c+1):

if j < weight[i]

: v[i]

[j]= v[i-1]

[j]else

: a = v[i-1]

[j] b = v[i-1]

[j-weight[i]

]+ value[i]

v[i]

[j]=

max(a,b)

print

(v[n]

[c])

x =[0]

*(n+1)

j = c

#記錄選擇了哪幾個物品

for i in

range

(n,0,-

1):#n,n-1,...,3,2,1

if v[i]

[j]> v[i-1]

[j]:

x[i]=1

j -= weight[i]

for i in

range

(n+1):

#列印選擇了哪幾個物品

if x[i]==1

:print

(i,end=

" ")

n=3, c=30, w=, v=

開始時,cr=c=30,v=0,c為容量,cr為剩餘空間,v為價值。

a為唯一活結點,也是當前擴充套件結點。

int n; //物品個數

int c; //揹包容量

int *w; //w[i]:物品i的重量

int *v; //v[i]:物品i的價值

int bestv; //最佳價值

int cw; //當前揹包重量

int cv; //當前揹包價值

int *x; //x[i]=0:未放置第i個物品 x[i]=1:放置該物品

void dfs(int i)

if((cw+w[i])<=c)

x[i]=0;

dfs(i+1);

}int main()

01揹包(動態規劃(回溯))

include 所謂動態規劃,就是分治策略加上不同的區域之間相互影響,如何從區域性最優解,到全域性最優解,這便是我們所關注的重點,因為還是分割成一塊一塊的,遞迴入手更好去理解。現有n件物品,其中第i件物品的重量為w i 價值為v i 有一容量為j的揹包,求在不超過揹包容量的情況下,使取得的商品的價值...

0 1揹包問題 動態規劃 回溯 分支限界法對比

2017.12.19 20 42 02 字數 3713 閱讀 2820 假定n個商品重量分別為w0,w1,wn 1,價值分別為p0,p1,pn 1,揹包載重量為m。怎樣選擇商品組合,使得價值最高?最大值的估算法 跟分支限界法本質上是一樣的 向上回溯的方法 w cur 表示當前正在搜尋的部分解中轉入的...

01揹包問題回溯法和動態規劃

題目要求 輸入揹包的容量v和物品的數量n 接下來n 行每行輸入兩個數字,第乙個是物品質量,第二個是物品價值 輸出揹包容納物品的最大價值。下面直接貼 回溯法 1 include 之前必須知道揹包容量和n個物品 2 include3 using namespace std 4class property...