揹包問題複習2

2021-08-05 20:10:17 字數 1313 閱讀 1205

題目

想法:首先這題的size和bag都很大,如果直接用動態規劃套原來的模板肯定不行,但是我們發現對於value的值比較小。那麼我們不妨反過來想這個問題,我們記錄對於選到第n個物品,價值達到j的重量最小的情況。這樣最後達到的目標肯定是裝的最多的。

code:

#include

#include

#define inf 0xfffffff

using

namespace

std;

int value[1000],bag[1000];

int dp[1000][1000];

int main(void)

fill(dp[0],dp[0]+1000,inf);

dp[0][0]=0;

for(int i=0;ifor(int j=0;j<=999;j++)

else}}

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

}cout

<普通解法:不斷迭代,用dp[i+1][j]表示用前i個數相加能否得到j。如果可以該單元為1,否則為0。

#include

using

namespace

std;

int num[1000],able[1000];

bool dp[1000][1000];

int main(void)

for(int i=0;icin>>able[i];

}for(int i=0;ifor(int j=0;j<=sum;j++)}}

cout

<優化:但是實際上使用dp來做布林運算是十分浪費的,我們可以用dp來儲存多一點的東西以便於後續的優化計算。

code:

#include

using

namespace

std;

int a[101],m[101];

int dp[100005];

int main(void)

for(int i=0;icin>>a[i];

}for(int i=0;icin>>m[i];

}for(int i=0;ifor(int j=0;j<=k;j++)

else

if(j0)

else}}

for(int i=1;i<=k;i++)

}cout

<}}

揹包問題2(完全揹包)

問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...

揹包問題2 完全揹包

一,題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入 揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。二,基本思路 從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件 取1件 取2件 等很多種。令f ...

揹包問題2

設f i,x 表示前i件物品,揹包容量為x時的最大價值,那麼轉移式可以表示為f i,x max f i 1,x w i c i f i 1,x 那麼f n,m 即為最優解。其實整體思想則表示為從容量為1的開始計算並且後面的計算不斷的使用前面已經計算的值,這樣就可以避免重複計算。code includ...