01揹包 完全揹包以及相關問題

2021-09-11 09:50:09 字數 1668 閱讀 2751

有n件物品和乙個容量為v的揹包。第i件物品的體積是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。

從這個題目中可以看出,01揹包的特點就是:每種物品僅有一件,可以選擇放或不放。

其狀態轉移方程為:f[i][v]=max

(表示在揹包剩餘容量為v,面對第i個物品決策時,可以獲得的最大價值總和)

private

static

intf

(int

c,int[

] w,

int n,

int v)

// 初始化首列

for(

int i =

0; i < dp.length; i++

)for

(int i =

1; i < dp.length; i++

)else}}

return dp[n]

[v];

}

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。

第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。

其狀態轉移方程:f[i][v]=max

注意其在至少選擇乙個i物品時,f[i][v] = f[i][v - c[i]] + w[i],與01揹包不同。

private

static

intf

(int

c,int[

] w,

int n,

int v)

// 初始化首列

for(

int i =

0; i < dp.length; i++

)for

(int i =

1; i < dp.length; i++

)else}}

return dp[n]

[v];

}}

1分2分5分的硬幣三種,組合成1角,共有多少種組合?

狀態轉移方程:dp[i][sum] = dp[i-1][sum - 0vm] + dp[i-1][sum - 1vm]+dp[i-1][sum - 2vm] + … + dp[i-1][sum - kvm];

其中k = sum / vm

/*

* 1分2分5分的硬幣三種,組合成1角,共有多少種組合?

*/public

class 硬幣組合 ;dp

(val,10)

;}private

static

voiddp(

int[

] val,

int n)

// 初始化列

for(

int i =

0; i < dp.length; i++

)// 狀態轉移方程

for(

int i =

1; i < dp.length; i++)}

} system.out.

println

(dp[val.length]

[n]);}

}

待補充

01揹包問題以及完全揹包問題

對於揹包問題。感覺揹包問題其實也是滾動陣列,就是看在揹包容量為v的情況下在前i個物品中獲得最大價值,一開始總看不懂,覺得每次取物品都只和前乙個i 1有關,怎麼去看全域性的物品。後面發現揹包容量v是關鍵,他是逆向遍歷,每取乙個物品i都把v從m到0都遍歷了個遍,然後在i 個物品的時候,裡面的v i 1 ...

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...

揹包問題 01揹包 完全揹包 多重揹包

01揹包和完全揹包的區別 01揹包的侷限在於每樣物品只有一種,每個物品都有乙個屬於自己的價值和重量,在給定的物品中選出揹包所能容納的最大重量,要求是價值最大 完全揹包與01揹包的不同在於完全揹包不限制每樣物品的個數,物品的價值和質量都與01揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...