From 4f979c0bdcf9fed9f39a06420d7eedbc533a08f2 Mon Sep 17 00:00:00 2001 From: nzy Date: Fri, 9 May 2025 11:53:21 +0800 Subject: [PATCH 1/2] save --- hw1/ZhongyiNi/answer.md | 27 ++++++++++++++++ hw1/ZhongyiNi/dp.jl | 70 +++++++++++++++++++++++++++++++++++++++++ hw1/ZhongyiNi/dptest.jl | 26 +++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 hw1/ZhongyiNi/answer.md create mode 100644 hw1/ZhongyiNi/dp.jl create mode 100644 hw1/ZhongyiNi/dptest.jl diff --git a/hw1/ZhongyiNi/answer.md b/hw1/ZhongyiNi/answer.md new file mode 100644 index 0000000..af51607 --- /dev/null +++ b/hw1/ZhongyiNi/answer.md @@ -0,0 +1,27 @@ +Let $S$ denote the optimal set. +$$ + v = \sum_{i \in S} v_i +$$ +$$ +v' = \sum_{i \in S'} v_i +$$ +$v' \leq v$ +$$ +\sum_{i \in S} [\frac{v_i}{K}] \leq \sum_{i \in S'} [\frac{v_i}{K}] +$$ +$$ +v/K-|S|=\sum_{i \in S} \frac{v_i}{K} - |S|<\sum_{i \in S} [\frac{v_i}{K}] \leq \sum_{i \in S'} [\frac{v_i}{K}]\leq \sum_{i \in S'} \frac{v_i}{K} = v'/K +$$ +$$ +x-1 < [x] \leq x +$$ + +$$ +\frac{v'}{v} > 1 - K|S|/v > 1 - Kl/v +$$ + +$$ +vmin < v/|S| < vmax +$$ +for i in 1:n +K=vmax/2^i \ No newline at end of file diff --git a/hw1/ZhongyiNi/dp.jl b/hw1/ZhongyiNi/dp.jl new file mode 100644 index 0000000..87de984 --- /dev/null +++ b/hw1/ZhongyiNi/dp.jl @@ -0,0 +1,70 @@ +struct Knapsack{T<:Integer} + W::T + w::Vector{T} + v::Vector{T} +end + +function dp(kp::Knapsack{T}) where T + l = length(kp.w) + vmax = maximum(kp.v) + wbound = sum(kp.w)+1 + @assert l == length(kp.v) + Sw = zeros(T,l,l*vmax) + Sset = Matrix{Vector{Int}}(undef,l,l*vmax) + for v in 1:l*vmax + for j in l:(-1):1 + if j == l + if kp.v[j] == v + Sw[j,v] = kp.w[j] + Sset[j,v] = [j] + else + Sw[j,v] = wbound + Sset[j,v] = Int[] + end + else + if v - kp.v[j] < 0 + Sw[j,v] = Sw[j+1,v] + Sset[j,v] = Sset[j+1,v] + else + if v == kp.v[j] + w_temp = kp.w[j] + set_temp = [j] + else + w_temp = kp.w[j] + Sw[j+1,v - kp.v[j]] + set_temp = [j] ∪ Sset[j+1,v - kp.v[j]] + end + if w_temp < Sw[j+1,v] + Sw[j,v] = w_temp + Sset[j,v] = set_temp + else + Sw[j,v] = Sw[j+1,v] + Sset[j,v] = Sset[j+1,v] + end + end + end + end + end + W = min(kp.W, wbound-1) + pos = findfirst(i->Sw[1,i] <= W ,l*vmax:(-1):1) + if isnothing(pos) + return zero(T),Int[] + else + optv = l*vmax-pos+1 + return Sw[1,optv],Sset[1,optv],optv + end +end + +function rescale_kp(kp::Knapsack{T},K) where T + return Knapsack(kp.W,kp.w,floor.(T,kp.v ./ K)) +end + +function _rescale_dp(kp::Knapsack,K) + kp2 = rescale_kp(kp,K) + w,set,_ = dp(kp2) + return w,set,sum(i -> kp.v[i], set) +end + +function rescale_dp(kp::Knapsack,ϵ) + + +end \ No newline at end of file diff --git a/hw1/ZhongyiNi/dptest.jl b/hw1/ZhongyiNi/dptest.jl new file mode 100644 index 0000000..25a0e7a --- /dev/null +++ b/hw1/ZhongyiNi/dptest.jl @@ -0,0 +1,26 @@ +using Test +include("dp.jl") + +@testset "testdp" begin + kp = Knapsack(10,[1,2,3,4,5],[2,3,4,5,6]) + w,set,optv = dp(kp) + @test w == 10 + @test set == [1,2,3,4] + @test optv == 14 +end + +@testset "rescale_kp" begin + kp = Knapsack(10,[1,2,3,4,5],[23,34,47,58,69]) + K = 10 + kp2 = rescale_kp(kp,K) + @test kp2.v == [2,3,4,5,6] +end + +@testset "rescale_dp" begin + kp = Knapsack(10,[1,2,3,4,5],[23,34,47,58,69]) + K = 10 + w,set,optv = _rescale_dp(kp,K) + @test w == 10 + @test set == [1,2,3,4] + @test optv == 162 +end From a6dc61df63fdf4cd0ee608416910e163a6463f5b Mon Sep 17 00:00:00 2001 From: nzy Date: Mon, 12 May 2025 17:07:16 +0800 Subject: [PATCH 2/2] save --- hw1/ZhongyiNi/answer.md | 20 ++++++++++++-------- hw1/ZhongyiNi/dp.jl | 5 ----- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/hw1/ZhongyiNi/answer.md b/hw1/ZhongyiNi/answer.md index af51607..782eac0 100644 --- a/hw1/ZhongyiNi/answer.md +++ b/hw1/ZhongyiNi/answer.md @@ -1,27 +1,31 @@ +## 9.6 +Follow the hints, we can easily get a $O(l^2v_{max})$ algorithm. But $v_{max}$ can be exponentially large with respect to the input size. Therefore, this will not imply P=NP. + +## 9.7 Let $S$ denote the optimal set. $$ v = \sum_{i \in S} v_i $$ +Let $S'$ denote the optimal set of problem $[v_i/K]$. $$ v' = \sum_{i \in S'} v_i $$ -$v' \leq v$ +We have $v' \leq v$ and $$ \sum_{i \in S} [\frac{v_i}{K}] \leq \sum_{i \in S'} [\frac{v_i}{K}] $$ +Since $$ -v/K-|S|=\sum_{i \in S} \frac{v_i}{K} - |S|<\sum_{i \in S} [\frac{v_i}{K}] \leq \sum_{i \in S'} [\frac{v_i}{K}]\leq \sum_{i \in S'} \frac{v_i}{K} = v'/K +x-1 < [x] \leq x $$ +we have $$ -x-1 < [x] \leq x +v/K-|S|=\sum_{i \in S} \frac{v_i}{K} - |S|<\sum_{i \in S} [\frac{v_i}{K}] \leq \sum_{i \in S'} [\frac{v_i}{K}]\leq \sum_{i \in S'} \frac{v_i}{K} = v'/K $$ +Thus, $$ \frac{v'}{v} > 1 - K|S|/v > 1 - Kl/v $$ -$$ -vmin < v/|S| < vmax -$$ -for i in 1:n -K=vmax/2^i \ No newline at end of file +I don't know how to decide $K$ with respect to $\epsilon$. \ No newline at end of file diff --git a/hw1/ZhongyiNi/dp.jl b/hw1/ZhongyiNi/dp.jl index 87de984..b7b6ded 100644 --- a/hw1/ZhongyiNi/dp.jl +++ b/hw1/ZhongyiNi/dp.jl @@ -62,9 +62,4 @@ function _rescale_dp(kp::Knapsack,K) kp2 = rescale_kp(kp,K) w,set,_ = dp(kp2) return w,set,sum(i -> kp.v[i], set) -end - -function rescale_dp(kp::Knapsack,ϵ) - - end \ No newline at end of file