打牌第三天之多重揹包

2021-08-09 02:49:16 字數 2274 閱讀 5352

多重揹包問題

題目:有n種物品和乙個容量為v的揹包。第i種物品最多有n[i]件可以取,每件體積是c[i],價值是w[i]。求解將哪些物品裝進揹包可使這些物品的體積總和不超過揹包的容量,且價值最大。

解法

1.和完全揹包不同的是,這裡的每件物品數量是有限制的,所以不能用完全揹包的一維解法。將原始完全揹包的狀態轉移改改 f[

i][v

]=ma

x(f[

i][v

],f[

i][v

−k∗c

[i]]

+k∗w

[i])

;0<=

k<=n[

i]時間複雜度為o(

v∗∑n

[i])

,空間複雜度為o(

v∗n)

2.轉化為01揹包。單純01揹包,時間複雜度為o(

v∗∑n

[i])

,空間複雜度為o(

∑n[i

]),可以優化一下,就是數量轉化為二進位制。時間複雜度為o(

v∗∑l

og(n

[i])

) ,空間複雜度為o(

∑log

(n[i

]))

3.時間複雜度為o(v*n),用單調佇列優化,參考和下面題目****(稍作改動)

我要長高

description

韓父有n個兒子,分別是韓一,韓二…韓n。由於韓家演技功底深厚,加上他們間的密切配合,演出獲得了巨大成功,票房甚至高達2000萬。舟子是名很有威望的公知,可是他表面上兩袖清風實則內心陰暗,看到韓家紅紅火火,嫉妒心遂起,便發微薄調侃韓二們站成一列時身高參差不齊。由於舟子的影響力,隨口一句便會造成韓家的巨大損失,具體虧損是這樣計算的,韓一,韓二…韓n站成一排,損失即為c*(韓i與韓i+1的高度差(1<=i

input

有若干組資料,一直處理到檔案結束。 每組資料第一行為兩個整數:韓子數量n(1

<=n<=50000)和舟子係數c(1<=c<=100) 接下來n行分別是韓i的高度(1

<=hi<=100)。

首先建立方程,很容易想到的是,dp[i][j]表示第 i 個兒子身高為 j 的最低花費。分析題目很容易知道,當前兒子的身高花費只由前乙個兒子影響。因此,

dp[i][j]=min(dp[i-1][k] + abs(j-k)*c + (x[i]-j)*(x[i]-j));其中x[i]是第i個兒子原本的身高

我們分析一下複雜度。

首先有n個兒子,這需要乙個迴圈。再者,每個兒子有0到100的身高,這也需要一維。再再者,0到100的每乙個身高都可以有前一位兒子的身高0到100遞推而來。

所以樸素演算法的時間複雜度是o(n*100*100)。題目只給兩秒,難以接受!

分析方程:

當第 i 個兒子的身高比第 i-1 個兒子的身高要高時,

dp[i][j]=min(dp[i-1][k] + j*c-k*c + x); ( k

<=j ) 其中 x=(x[i]-j)*(x[i]-j)。

當第 i 個兒子的身高比第 i-1 個兒子的身高要矮時,

dp[i][j]=min(dp[i-1][k]

-j*c+k*c + x); ( k>

=j )

對第乙個個方程,我們令 f[i-1][k]=dp[i-1][k]-k*c, g[i][j]=j*c+x; 於是 dp[i][j] = min (f[i-1][k])+ g[i][j]。轉化成這樣的形式,我們就可以用單調佇列進行優化了。

第二個方程同理。

接下來便是如何實現,實現起來有點技巧。具體見下

#include 

#include

#include

#include

#include

using namespace std;

#define inf ox3f3f3f3f

int dp[2][101],n,c,q[101],head,tail,cur;

int main()

}//i short

head=tail=0;

for(j=100;j>=0;j--)//倒著寫,是因為當前人比前面高,如果當前人的身高是j,需要知道前乙個人比他矮的情況

}int ans=inf;

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

ans=min(ans,dp[cur][i]);

return

0;}

揹包問題之多重揹包

相比完全揹包問題,多重揹包指定物品個數。我們可以將多重揹包問題轉化為0 1揹包 容易超時,優化後續補充 進行處理。求最好價值問題的多重揹包不能使用記錄使用物品次數的方式進行簡化 題目給定一些不同價值的硬幣,求這些硬幣可以組成1 n範圍內值的數量。public int backpack int n,i...

揹包問題之多重揹包

其實感覺多重揹包比01揹包和完全揹包都要難,每件物品的數量可能不止一件,還是求放入揹包的物品的最大價值。在揹包九講中,給出的動態轉移方程為 f i v max 但是感覺還是考慮邊界問題比較煩人,所以我想的是把多重揹包和之前的01揹包聯絡起來.不知道行不行 這裡我寫了一種一維dp陣列的寫法,在這題測試...

dp 揹包之多重揹包

問題 多重揹包也是 0 1 揹包的乙個變式。與 0 1 揹包的區別在於每種物品有ki個,而非乙個。解決方案 將k個相同的物品,看作k個不同的物品,但是wi,ci都一樣。即可套用 01揹包方案 詳見 優化方法 二進位制優化 設k個物品分成 a xx a xx 1 a xx k 1 個物品。那麼 a x...