01揹包問題總結

2021-09-25 22:58:38 字數 1575 閱讀 3721

記憶化搜尋 按重量窮竭搜尋  按**窮竭搜尋 三種方式

#include#include#include#include#include#include#include#include#define max 110

#define inf 10000000

using namespace std;

int n,w;

int v[max];

int w[max];

int dp[max][max];

int rec(int i, int j)

if(i == n)

else if(j < w[i])

else

return dp[i][j] = res;

}void solve()

//測試函式

int main()

cin >> n;

for(int i=0; i> w[i] >> v[i];

cin >> w;

solve();

cin.close();//開啟檔案以後要關閉

return 0;

}

窮竭搜尋+剪枝較為方便

#include#include#include#include#include#include#include#include#define max 110

#define inf 10000000

using namespace std;

int n, w;

int dp[max][max];

int w[max], v[max];

//測試函式

int main()

cin >> n;

for(int i=0; i> w[i] >> v[i];

cin >> w;

memset(dp,0,sizeof(dp));

//窮竭搜尋

for(int i=0; i按**窮竭搜尋  進行了空間優化

#include#include#include#include#include#include#include#include#define max 110

#define inf 10000000

using namespace std;

int n, w;

int dp[max];

int w[max], v[max];

//測試函式

int main()

cin >> n;

for(int i=0; i> w[i] >> v[i];

cin >> w;

for(int i=0; i=v[i]; j--)

//找到合適的重量

int ans = 0;

for(int i=0; i<=11; i++)

if(dp[i] <= w)

ans = max(ans,i);

cout << ans << endl;

cin.close();//開啟檔案以後要關閉

return 0;

}

揹包問題 01揹包總結

寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...

01揹包問題總結

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用dp問題 求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,...

0 1 揹包問題總結

一 問題描述 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。二 解決方案 考慮使用dp問題 求解,定義乙個遞迴式 opt i v 表示前i個物品,在揹包容量大小為v的情況下,...