題目
有n件物品和一個容量為v的揹包。第i件物品的費用是w[i],價值是v[i],求將哪些物品裝入揹包可使價值總和最大。基本思路
01揹包的特點有兩個:乙個是每件物品有且只有乙個,二是每個物品可以選擇放或者不放。
一般狀態轉移方程定義為:dp[i]
[j]= max ( dp[i-1]
[j],dp[i-1]
[j-w[i]
]+v[i]
)這裡的dp[i]
[j]= n表示前i件物品放入揹包容量為j的揹包的最大價值為n。
對於每個物品來說,都可以選擇放進或者不放進揹包。如果選擇不放進揹包,那麼第i個件物品可有
可無,此時問題轉換為"前i-1件物品放入容量為j的揹包的最大價值";如果選擇放進揹包,那麼此時問題
轉換為"前i-1件物品放入容量為j-w[i]揹包的最大價值"
暴力法,窮舉所有組合
int
numofone;
int[
] numofzero;
string[
] strs;
/* 對於strs中每個元素,都有選和不選兩種選擇
1) 選擇該元素,那麼我們手上的0和1相應的減少,但是我們的數量+1
2)不選擇該元素,有兩種情況
2.1 該元素需要的1和0,超出我們所擁有的1和0範圍,此時跳過該元素
2.2 選了該元素太虧了,我們可以通過比較最後的數量來避免該情況
*/public
intfindmaxform
(string[
] strs,
int m,
int n)
return
f(m,n,0)
;}//m個0 n個1
public
intf
(int m,
int n,
int index)
//arr[0]:統計str中0的個數 存於arr[0]中
//arr[1]:統計str中1的個數 存於arr[1]中
public
int[
]count
(string str)
return arr;
}
動態規劃優化
public
intfindmaxformbydp
(string[
] strs,
int m,
int n)}}
//for(int arr:dp)
return dp[m]
[n];
}
揹包問題之01揹包問題
題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...
揹包問題之01揹包
01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...
揹包問題之0 1揹包
0 1揹包是最基本的揹包問題,其核心思路就在於每個物品的放與不放 每個物品最多只能放一次 題目有 n 個物品和乙個大小為 m 的揹包.給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.問最多能裝入揹包的總價值是多大?樣例輸入 m 10,a 2,3,5,7 v 1,5,2,4 輸出 9 ...