記憶化搜尋 按重量窮竭搜尋 按**窮竭搜尋 三種方式
#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的情況下,...