聽學長講了演算法之後,總結了一下揹包問題的兩種方法,當然這並不是最優的,會tle。
題目描述
給定乙個物品集合s={1,2,3,…,n},物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。
輸入
輸入包含多組測試用例。
第乙個資料是揹包的容量為c(1≤c≤2500),第二個資料是物品的數量為n。接下來n行是物品i的重量是wi,其價值為vi。所有的資料全部為整數,且保證輸入資料中物品的總重量大於揹包的容量。
當c=0時,表示輸入資料結束。
輸出
對每組測試資料,輸出裝入揹包中物品的最大價值。
第一種方法,遞迴演算法:考慮每一種情況拿還是不拿,也可對齊進行可行性剪枝,如果當前的重量已經超過總重,直接return;
#include #include #include int ans=0;
int z;
void beibao(int sumw,int sumv,int n,int step,int v,int w,int c)
//拿beibao(sumw+w[step],sumv+v[step],n,step+1,v,w,c);
//不拿
beibao(sumw,sumv,n,step+1,v,w,c);
}int main()
beibao(0,0,n,1,v,w,c);
printf("%d\n",ans);
return 0;
}
第二種方法,二進位制轉化法,其實道理是一樣的,每一件都對應乙個狀態,不拿為0,拿為1,如果n=3,則情況為從000到111共8種,所以**如下:
#include #include int main()
for(int i=0;ic)
continue;
else
ans=fmax(ans,sum2);
}printf("%d\n",ans);
}return 0;
}
但是要注意這兩種演算法,只適用於n很小的時候,如果n>10,會tle,優化的演算法還有學會見諒了。
菜鳥**,大神勿噴。
揹包問題 01揹包總結
寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
0 1揹包問題(遞迴解決)
問題剖析 0 1揹包問題規定每個物品要麼選,要麼不選。因此可以設定物品選擇向量為y y1,y2,yn 那麼當yn 1時,y y1,y2,yn 1 必然為f n 1,c wn 的物品選擇向量,當yn 0時,必然為f n 1,c 的最優物品選擇向量。所以此時可以考慮動態規劃解法。得到根據上面的分析,我們...