從N個正數中選取若干個數之和最接近M(不能超過M)

2021-09-27 03:18:07 字數 1008 閱讀 8058

這類題型是我們平時所常見的,粗看題目可能會覺得很像揹包問題,但是感覺狀態轉移方程又不是那麼容易就可以推出。其實,我們可以把m當作為揹包的容量,n個正數對應的陣列value[n]既當作其價值,又當作其重量。此時的狀態轉移方程如下:

當n >= 1, m < value[n-1]時:

f (n

,m)=

f(n−

1,m)

f(n,m) = f(n-1, m)

f(n,m)

=f(n

−1,m

)當n >= 1, m >= value[n-1]時:

f (n

,m)=

max(

f(n−

1,m)

,f(n

−1,m

−val

ue[n

−1])

+val

ue[n

−1])

f(n,m) = max(f(n-1,m),f(n-1,m-value[n-1])+value[n-1])

f(n,m)

=max

(f(n

−1,m

),f(

n−1,

m−va

lue[

n−1]

)+va

lue[

n−1]

)上式中前乙個value[n-1]表示重量,後乙個value[n-1]表示其價值。

有了狀態轉移方程後,我們便可以使用遞迴或者自底向上求解,此處我使用自底向上求解,並只使用一維陣列記錄中間值的方式。具體**如下:

private

static int getnearestsum

(int m, int[

] value)}}

return result[m]

;}

從給定的N個正數中選取若干個數之和最接近M

這道題跟撈魚問題一樣,都是剛進實驗室新生培訓那會兒做過的題目,不過這個是一師姐當時找工作的面試題。如題,並輸出該子串行 測試用例 2,9,5,7,4,11,10 分別輸出最接近33 40 47 60的子串行 分析 n個數之和接近m,將m看做乙個容量的揹包,這個題目就變成了典型的01揹包,m容量下求最...

如何從一堆數中選出若干個數,使其和等於給定的數?

如題,比如有一堆數 13,2,4,2,4,8,7,8,6 要從中挑選出若干個數,使得它們的和等於32,挑選出來的數是 20,6,4,2 我是使用 試探 法來解這個題目,思路如下 先對數進行排序 13,8,8,7,6,4,4,2,2 選出最大的數字,以及不大於目標數字後續數字,於是我挑選到了13,8,...

等概率無重複的從n個數中選取m個數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!問題描述 程式的輸入包含兩個整數m和n,其中m學習過概率統計的同學應該都知道每乙個數字被抽取的概率都應該為m n.那麼我們怎麼構造出這樣的概率呢?在 程式設計珠璣 上面是這樣解析的 依次考慮整數0,1,2,n 1,並通過乙個適當的隨機測試對每個整數...