01揹包:有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight[i]與價值value[i],求解如何裝包使得價值最大。
dp(i,v)表示前i個物體(包括第i個)面對容量為v的揹包的最大價值,c[i]代表物體i的重量,w[i]代表物體i的價值;如果第i個物體不放入揹包,則揹包的最大價值等於前i-1個物體面對容量v的最大價值;如果第i個物體選擇放入,則揹包的最大價值等於前i-1個物體面對容量v-cost[i]的最大價值加上物體i的價值w[i]。
對於實現,一般採用乙個二維陣列(狀態轉移矩陣)dp[i][j]來記錄各個子問題的最優狀態,其中dp[i][j]表示前i個物體面對容量j揹包的最大價值。
下面給出0-1揹包的基本實現,時間複雜度為o(n*v),空間複雜度也為o(n*v)
#includeusing namespace std;
int dp[1005][1005];
int weight[1005];
int value[1005];
int main()
}cout《運**況用二維的表來看:
name weight value 1 2 3 4 5 6 7 8 9 10
a 4 6 0 0 0 6 6 6 6 6 6 6
b 5 4 0 0 0 6 6 6 6 6 10 10
c 6 5 0 0 0 6 6 6 6 6 10 11
d 2 3 0 3 3 6 6 9 9 9 10 11
e 2 6 0 6 6 9 9 12 12 15 15 15
優化:for(i=1;i<=n;i++)
}
其執行過程也是上述的二維表:
name weight value 1 2 3 4 5 6 7 8 9 10
a 4 6 0 0 0 6 6 6 6 6 6 6
b 5 4 0 0 0 6 6 6 6 6 10 10
c 6 5 0 0 0 6 6 6 6 6 10 11
d 2 3 0 3 3 6 6 9 9 9 10 11
e 2 6 0 6 6 9 9 12 12 15 15 15
初始化:
1.沒要求恰好裝滿memset(dp,0,sizeof(dp))
2.恰好裝滿:dp[0]=0;dp[其他]=負無窮
揹包 01揹包,完全揹包,多重揹包
哈哈 01揹包 f i v max 完全揹包 f i v max 多重揹包 f i v max include include include include include define maxn 1000 using namespace std int n,cap int w maxn 重量 花...
01揹包 完全揹包 多重揹包
01揹包 zeroonepack 有n件物品和乙個容量為v的揹包,每種物品均只有一件。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。include include includeusing namespace std const int n 1000 10 int ...
01揹包 完全揹包 多重揹包
01揹包 zeroonepack 有n件物品和乙個容量為v的揹包。每種物品均只有一件 第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。完全揹包 completepack 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求...