01揹包動態規劃空間優化
問題描述:
給定 n 種物品和一個容量為 w 的揹包,物品 i 的價值是 vai,其體積為 voi。
問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?
解題思路:
狀態轉移方程為:
dp[i][j] = dp[i-1][j] j < vo[i] (即此時的揹包容積小於第i個物品的體積)
dp[i][j] = max( dp[i-1][j] , dp[i-1][j-vo[i]] + va[i] ) j >= vo[i] (當揹包容積大於第 i 個物品的體積時,有兩種選擇,選較大的一個)
兩種選擇:
1、不裝這個物品 。則此時dp陣列的值還是第i-1個物品是的值,即dp[i-1][j]
2、裝下這個物品,此時是dp[i-1][j-vo[i]] + va[i],然後與不裝比較看哪種情況裝的物品的價值更大
程式碼:
#include<stdio.h>
#include<algorithm>
using namespace std;
int dp[105][105];
int va[105] , vo[105];//每件物品的價值va和體積vo
int main()
{
int w , n ;//揹包的總容量,物品的件數
scanf("%d %d",&n,&w);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d %d",&va[i],&vo[i]);
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = 0 ; j <= w ; j++)
{
if( vo[i] > j)
{
dp[i][j] = dp[i-1][j];
}
else
{
dp[i][j] = max(dp[i-1][j] , dp[i-1][j-vo[i]] + va[i]);
}
}
}
printf("%d\n",dp[n][w]);
return 0;
}
空間優化程式碼:
只開闢一維dp陣列,每次更新是重最後向前迴圈,畢竟只需要最後一個結果,中間的過程可以不儲存,但一定確保從後向前迴圈
#include<stdio.h>
#include<algorithm>
using namespace std;
int va[105] , vo[105];//每個物品的價值和體積
int dp[105];
int main()
{
int n , w;//物品數量和揹包容積
scanf("%d %d",&n,&w);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d %d",&va[i] , &vo[i]);
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = w ; j >= vo[i] ; j--)//要倒著進行,確保在沒有被更新的狀態下使用
{
dp[j] = max(dp[j - vo[i]] + va[i] , dp[j]);
}
}
printf("%d",dp[w]);
return 0;
}
相關文章
- 多重揹包動態規劃及空間優化動態規劃優化
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 動態規劃系列之六01揹包問題動態規劃
- 動態規劃-揹包01問題推理與實踐動態規劃
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 【動態規劃】揹包問題動態規劃
- 揹包問題----動態規劃動態規劃
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 動態規劃篇——揹包問題動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 0-1揹包問題(動態規劃)動態規劃
- 01揹包優先佇列優化佇列優化
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 斜率優化動態規劃優化動態規劃
- 前端與演算法-動態規劃之01揹包問題淺析與實現前端演算法動態規劃
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 【動態規劃】一次搞定三種揹包問題動態規劃
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 【模板】01揹包、完全揹包
- 01 揹包
- 01揹包、完全揹包、多重揹包詳解
- 揹包問題(01揹包與完全揹包)
- 區間動態規劃動態規劃
- 運籌優化(七)--動態規劃解析優化動態規劃
- 01揹包、有依賴的揹包
- 【LeetCode動態規劃#07】01揹包問題一維寫法(狀態壓縮)實戰,其二(目標和、零一和)LeetCode動態規劃
- [動態規劃] 區間 dp動態規劃
- PHP使用動態規劃實現最優紅包組合PHP動態規劃
- 01揹包問題
- POJ 2184 (01揹包)