1. 程式人生 > >總結-01揹包問題

總結-01揹包問題

0-1 揹包問題:

給定 n 種物品和一個容量為 C 的揹包,物品 i 的重量是 wi,其價值為 vi 。

問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?

特點:面對每個物品,我們只有選擇拿取或者不拿兩種選擇,不能選擇裝入某物品的一部分,也不能裝入同一物品多次

解決辦法:宣告一個 大小為  m[n][c] 的二維陣列,m[ i ][ j ] 表示 在面對第 i 件物品,且揹包容量為  j 時所能獲得的最大價值 ,那麼我們可以很容易分析得出 m[i][j] 的計算方法,

(1). j < w[i] 的情況,這時候揹包容量不足以放下第 i 件物品,只能選擇不拿

m[ i ][ j ] = m[ i-1 ][ j ]

(2). j>=w[i] 的情況,這時揹包容量可以放下第 i 件物品,我們就要考慮拿這件物品是否能獲取更大的價值。

如果拿取,m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]。 這裡的m[ i-1 ][ j-w[ i ] ]指的就是考慮了i-1件物品,揹包容量為j-w[i]時的最大價值,也是相當於為第i件物品騰出了w[i]的空間。

如果不拿,m[ i ][ j ] = m[ i-1 ][ j ] , 同(1)

究竟是拿還是不拿,自然是比較這兩種情況那種價值最大。

由此可以得到狀態轉移方程:

if(j>=w[i])
      m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
else
      m[i][j]=m[i-1][j];



例:0-1揹包問題。在使用動態規劃演算法求解0-1揹包問題時,使用二維陣列m[i][j]儲存揹包剩餘容量為j,可選物品為i、i+1、……、n時0-1揹包問題的最優值。繪製
價值陣列v = {8, 10, 6, 3, 7, 2},

重量陣列w = {4, 6, 2, 2, 5, 1},

揹包容量C = 12時對應的m[i][j]陣列。

0    1    2    3    4    5    6    7    8    9    10    11    12
1    0    0    0    8    8    8    8    8    8    8    8    8
2    0    0    0    8    8    10    10    10    10    18    18    18
3    0    6    6    8    8    14    14    16    16    18    18    24
4    0    6    6    9    9    14    14    17    17    19    19    24
5    0    6    6    9    9    14    14    17    17    19    21    24
6    2    6    8    9    11    14    16    17    19    19    21    24
(第一行和第一列為序號,其數值為0)
如m[2][6],在面對第二件物品,揹包容量為6時我們可以選擇不拿,那麼獲得價值僅為第一件物品的價值8,如果拿,就要把第一件物品拿出來,放第二件物品,價值10,那我們當然是選擇拿。m[2][6]=m[1][0]+10=0+10=10;依次類推,得到m[6][12]就是考慮所有物品,揹包容量為C時的最大價值。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int n,c;//n種物品,c為容量 
	int dp[105][105];//表示再面對第i件物品,揹包容量為j時所獲得的最大價值 
	int w[105],v[105];
	cin>>n>>c;
	for(int i=1;i<=n;i++)
	  cin>>w[i]>>v[i];
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=c;j++)
	   {
	   	if(j>=w[i])
	   	    dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
	   	else
	   	    dp[i][j]=dp[i-1][j];
		} 
	cout<<dp[n][c]<<endl;
	return 0;
}


作者:青龍指引你 
來源:CSDN 
原文:https://blog.csdn.net/xp731574722/article/details/70766804 
版權宣告:本文為博主原創文章,轉載請附上博文連結!