動態規劃之0 1揹包問題

2021-07-23 03:46:33 字數 1403 閱讀 2101

下面這篇博文講述的原理淺顯易懂,但是他沒有輸出哪些被選擇了。

本文在這一篇的基礎上進行改進:重構被選擇的金礦。

矩陣 maxgold[people][goldindex] 行序號people表示給的總人數,列序號表示挖在前 goldindex 個金礦裡選擇挖哪幾個。

關鍵點:

maxgold[peopletotaltemp][gtemp] == maxgold[peoplecut][gtemp - 1] + gold[gtemp]
則 第 gtemp 個金礦被挖!

詳細見下面的**!

#include

#include

#include

using

namespace

std;

const

int max_n = 100;//程式支援的最多金礦數

const

int max_people = 10000;//程式支援的最多人數

int n;//金礦數

int peopletotal;//可以用於挖金子的人數

int peopleneed[max_n];//每座金礦需要的人數

int gold[max_n];//每座金礦能夠挖出來的金子數

int maxgold[max_people][max_n];//maxgold[i][j]儲存了i個人挖前j個金礦能夠得到的最大金子數,等於-1時表示未知

//int goldselect[max_n] = ;

int select[max_n] = ; // 記錄被選擇的金山 ,選擇記為 1

void init()

// 重構被選擇的金山

void reconstructsel()

gtemp--;

}}void printres()

output << endl;

}output << "被先擇的金山 : "

<< endl;

for (int gindex = 0; gindex < n; gindex++)

}output << "一共選擇 "

<< count << "個金山 , 總金書為 "

<< maxgold[peopletotal][n - 1] << endl;

}int getmaxgold(int peopleleft, int goldhillleft)

else

else

}else

else

}maxgold[peopleleft][goldhillleft] = retmaxgold;

}

return retmaxgold;

}int main()

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...