在之前的01揹包問題中,我們可以發現約束項都只有乙個,下面我們來**兩個約束項的情況;
首先,我們考慮使用一維還是二維來表達:在有乙個約束項時,我們需要二維,因為橫向表示物品數,而豎向表示約束項的改變;所以我們發現,當有兩個約束項的時候,不能再使用二維陣列的方式了;
所以,我們決定使用一維陣列;再考慮,一維陣列時,用陣列的下標來表示約束項的改變,那麼當有兩個約束項的時候,明顯下標不夠,那麼什麼能用來表示兩個約束項呢?
那就是二維陣列。它包含的兩個下標,正好分別對應了每個約束項;
所以,經過這樣的思維流程,我們可以發現,其實含有兩個約束項的二維陣列實質上是由一維陣列的表達演算法衍化而來;
那麼,我們在書寫**的時候,就要注意了,最大的迴圈應該依舊是物體的個數,因為不管怎樣,都要遍歷完所有的物品,即:
for(int k=1;k<=n;++k)
然後我們需要對兩個約束項的0-m都進行遍歷,即:
for(int i=m1;i>=0;--i)
for(int j=m2;j>=0;--j)
因為此方式是由一維陣列的放大衍化而來的,所以遍歷的時候,只能逆序遍歷;
然後,我們應該考慮到,每次進行更新的時候,不能只對乙個約束項進行控制,而是兩個一起考慮,所以if條件應該修改為:
if(j>=a[k]&&i>=b[k])
而在更新的時候,同樣應該進行兩項的下標更新:
f[i][j]=max(f[i][j],f[i-b[k]][j-a[k]]+c[k]);
此**主要部分已差不多說完,上完整**:
#include
#include
#define max(a,b) (a>b? a:b)
int f[3000][3000];
int*a,*b,*c;
int main()
printf("%d",f[v][m]);
return
0;}
揹包問題(C語言)
問題描述 有n件物品 是件不是種!每件物品有自己的重量w n 和價值v n 現有乙個容量為bag的揹包,要在揹包容量滿足的條件下將物品們裝入揹包,使總價值最大,試問應該怎樣放入?最大值為多少?基本思路 該問題中每個物體僅有放入或不放入兩種情況,故稱為01揹包問題。現有二元函式maxvalue i,w...
c語言貪心演算法揹包問題 九章演算法 揹包問題
在n個物品中挑選若干物品裝入揹包,最多能裝多滿?假設揹包的大小為m,每個物品的大小為a i 樣例 1 輸入 3,4,8,5 backpack size 10 輸出 9 樣例 2 輸入 2,3,5,7 backpack size 12 輸出 12 演算法 dp從已知的題目中,可以總結出以下兩點 那麼考...
C語言演算法之揹包演算法
在 0 1 揹包問題中,需對容量為 c 的揹包進行裝載。從 n 個物品中選取裝入揹包的物品,每件物品 i 的重量為 wi 價值為 pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高,即n i 1pi xi 取得最大值。約束條件為n i 1wi xi c ...