java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和
首先讓我們將這個問題簡化為整數(shù)而不是實數(shù),否則我們將無法獲得快速優(yōu)化算法.例如,讓我們將所有數(shù)字乘以100,然后將其四舍五入為下一個整數(shù).所以說我們有項目大小x1,…,xn和目標大小Y.我們想要最小化該值
k1 x1 + … + kn xn – Y
在這種條件下
(1) ki is a non-positive integer for all n ≥ i ≥ 1
(2) k1 x1 + … + kn xn – Y ≥ 0
一個簡單的算法就是問一系列問題
>我們能達到k1 x1 … kn xn = Y 0嗎?
>我們能達到k1 x1 … kn xn = Y 1嗎?
>我們能達到k1 x1 … kn xn = Y z嗎?
>等隨著z的增加
直到我們得到答案“是”.所有這些問題都是Knapsack問題的實例,權(quán)重設(shè)置等于項目的值.好消息是,如果我們可以為z建立上限,我們可以立即解決所有這些問題.很容易證明存在z≤Y的解,除非所有xi都大于Y,在這種情況下解決方案只是選擇最小的xi.
所以讓我們使用pseudopolynomial dynamic programming approach來解決背包:讓f(i,j)為1,如果我們可以使用前i項(x1,…,xi)達到總項目大小j.我們已經(jīng)復(fù)發(fā)了
f(0,0) = 1
f(0,j) = 0 for all j > 0
f(i,j) = f(i - 1, j) or f(i - 1, j - x_i) or f(i - 1, j - 2 * x_i) ...
我們可以在O(n * Y)時間和O(Y)空間中解決這個DP陣列.結(jié)果將是第一個j≥Y,其中f(n,j)= 1.
有一些技術(shù)細節(jié)留給讀者練習:
>如何在Java中實現(xiàn)它>如果需要,如何重建解決方案.這可以使用DP陣列在O(n)時間內(nèi)完成(但是我們需要O(n * Y)空間來記住整個事物).
總結(jié)
以上是生活随笔為你收集整理的java数字不等于_java – 仅使用set中的数字查找等于或大于给定目标的总和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.12PMP试题每日一题
- 下一篇: JDBC实战(一)JDBC概述