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