题目1:背包问题
背包二维解法
func bagValue(_ weight: [Int], _ value: [Int], _ bagSize: Int) -> Int {
guard weight.count > 0, value.count > 0, bagSize > 0 else { return 0 }
var dp = Array(repeating: Array(repeating: 0, count: bagSize + 1), count: weight.count)
for i in 0..<weight.count { dp[i][0] = 0 }
for i in 0...bagSize {
if i >= weight[0] {
dp[0][i] = value[0]
}
}
for i in 1..<weight.count {
for j in 0...bagSize {
if weight[i] > j {
dp[i][j] = dp[i - 1][j]
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
}
}
}
return dp[weight.count - 1][bagSize]
}
print("\(bagValue([1, 3, 4], [15, 20, 30], 4))")
print("\(bagValue([2, 2, 3, 1, 5, 2], [2, 3, 1, 5, 4, 3], 1))")
题目2:背包问题
背包一维解法
func bagValue(_ weight: [Int], _ value: [Int], _ bagSize: Int) -> Int {
var dp = Array(repeating: 0, count: bagSize + 1)
for i in 0..<weight.count {
for j in (0...bagSize).reversed() {
if j < weight[i] { break }
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
}
}
return dp[bagSize]
}
print("\(bagValue([1, 3, 4], [15, 20, 30], 4))")
print("\(bagValue([2, 2, 3, 1, 5, 2], [2, 3, 1, 5, 4, 3], 1))")
题目3:416.分割等和子集
讲解
leetcode
class Solution {
func canPartition(_ nums: [Int]) -> Bool {
let nums = nums.sorted()
let totalSum = nums.reduce(0, +)
if totalSum % 2 != 0 { return false }
print("\(totalSum)")
var set = [Int]()
var sum = 0
func recursive(_ nums: [Int], _ start: Int) -> Bool {
print("\(set)")
if start == nums.count { return false }
for i in start..<nums.count {
if sum + nums[i] == totalSum / 2 { return true }
if sum + nums[i] > totalSum / 2 { break }
set.append(nums[i])
sum += nums[i]
if recursive(nums, i + 1) { return true }
sum -= nums[i]
set.removeLast()
}
return false
}
if recursive(nums, 0) { return true }
return false
}
}
class Solution {
func canPartition(_ nums: [Int]) -> Bool {
let sum = nums.reduce(0, +)
if sum % 2 != 0 { return false }
let target = sum / 2
var dp = Array(repeating: 0, count: target + 1)
for i in 0..<nums.count {
for j in (0...target).reversed() {
if nums[i] > j { break }
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
}
}
return dp[target] == target
}
}