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...