完全揹包問題

2021-08-31 18:11:29 字數 1379 閱讀 7276

參考了以下幾篇部落格:

完全揹包問題:

在n種物品中選取若干件(同一種物品可多次選取)放在空間為w的揹包裡,每種物品的體積為w1,w2,…,wn,與之相對應的價值為v1,v2,…,vn.求解怎麼裝物品可使揹包裡物品總價值最大。

解答

對於此問題可以寫出狀態轉移方程:

dp[i][j] = max(0<=k*w[i]<=j)

dp[i][j]表示前i種物品恰放入乙個容量為j的揹包的最大價值,那我們用k表示當前容量下可以裝第i種物品的件數。我們要保證 dp[i-1][j-kw[i]] 中 j-kw[i]>=0那麼k的範圍應該是0≤k≤j/w[i]。dp[i-1][j - k * w[i]] + k * w[i]的含義是在j的容量取不同k個第i物品的價值。dp[i-1][j - k * w[i]]的含義是在j-k*w[i]的容量下前i-1個物品的價值。

public static void main(string args) 

我們用偽**來描述這種情況:

if 物品i的體積 > 剩餘體積j

則d[i][j] = d[i-1][j];

else

則d[i][j] = max

我們可以把把完全揹包問題轉化為01揹包問題來解,第i種物品最多選w/v[i]件,於是可以把第i種物品轉化為j/v[i]件費用及價值均不變的物品,然後求解這個01揹包問題。

即:將一種物品拆成多件物品。

我們現在dp每乙個物品,dp出該種物品在不同剩餘容量下的最優解,他是以每1個為單位的。考慮是否在當前所有物品總數中新增一件新的該物品

我們用i代表前i種物品,w代表包的最大承重,w[i]是第i種物品消耗的空間、v[i]是第i種物品的價值、f[i,j]是最大價值(從前i種物品取若干件放入有j個剩餘空間的包)有j個剩餘空間的包和有j個空間的包的含義是一樣的。

如果不放那麼dp[i][j]=dp[i-1][j]

如果確定放,那麼dp[i][j]=dp[i][j-w[i]+v[i]],為什麼會是dp[i][j-w[i]]+v[i]?

因為我們要考慮的是在當前基礎上新增一件物品i。

就是說如果你放第i種物品,並不牽扯到第i-1種物品,所以不管你放多少件,都要在第i種商品的基礎上操作

所以說遞推式為:

dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i])

public static void main(string args)

solve_2(n,w,w,v);

}static void solve_2(int n,int w,int w,int v)else}}

system.out.println(dp[n][w]);

}

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

完全揹包問題

這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...

完全揹包問題

設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...