完全揹包問題

2021-09-11 18:05:59 字數 1355 閱讀 3106

乙個揹包總容量為v,現在有n個物品,第i個 物品體積為weight[i],價值為value[i],每個物品都有無限多件,現在往揹包裡面裝東西,怎麼裝能使揹包的內物品價值最大?

輸入樣例
3 7

3 4 2

4 5 3

輸出樣例
解析:完全揹包問題中,物品無限多件,只要揹包沒滿,就可以一直新增

狀態轉移方程為:

dp[ i+1 ][ j ] = max(dp[ i ][ j-k*weight[ i ] ] +k*value[ i ],dp[ i+1 ][ j ])

**如下:

int dp[manx+5]

[maxn+5]

void

solve()

}}printf

("%d\n"

,dp[n]

[w])

;}

這裡用到了3重迴圈,關於k的迴圈最壞的可能從0迴圈到w,所以演算法的複雜度為o(n * w*w),這樣不夠好,我們可以找一下演算法中多餘的計算可以得出狀態轉移式:

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

這樣就省去了關於k的迴圈,**如下:

int dp[manx+5]

[maxn+5]

void

solve()

}printf

("%d\n"

,dp[n]

[w])

;}

此外,還可以用一維陣列來做

int dp[maxn+5]

;void

solve()

}printf

("%d\n"

,dp[w]);

}

ac**:

#include

#include

#include

#include

#define maxn 100

using namespace std;

int n,w;

int v[maxn+5]

,w[maxn+5]

;int dp[maxn+5]

;void

solve()

}printf

("%d\n"

,dp[w]);

}int

main

(void

)

揹包問題(完全揹包)

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...