有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揹包一樣,也同樣是求在給定大小的容量中,找出最大價值的選擇 ...