題目:
想法:首先這題的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...