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

2022-01-15 05:01:51 字數 1637 閱讀 2585

如題,比如有一堆數: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,8,其和是29,如果這個時候再挑選7的話就會超過32,所以就跳過,嘗試在後面找到合適的數字,找到4,加上仍然大於32,再接著找到2,這次好了,加起來是31。

但不幸的是仍然不符合要求,而且已經到底了,所以還要往前退,退到8,取消對8的選擇,選擇更小的數字7:

再嘗試選擇小於等於32的數字,6不符合,跳過,4,正好符合,13+8+7+4=32,挑選數字完成!

好,演算法描述好了,如何用**來實現?

這種不知道要迴圈多少次的問題最好還是用遞迴來處理,把這個問題簡化成以下的問題:

具體**見下:

public

class

combinehelper

//找組合

public list findcombination(int

value)

if (find(value, 0

)) }

return

result;

}throw

new exception("

無法組合");

}private

bool find(int value, int

startidx)

//跳過

if (_array[i] >value)

//匹配成功

if (_array[i] ==value)

//_array[i] < value,嘗試選擇當前這個數並在後面的數中再去匹配餘數

for (int step = 0; i + step < _array.length; step++)

}return

false

; }

}

這段**除開一些封裝/初始化的部分之外,也沒幾行了,真正有用的就是find方法,遞迴的**就是簡潔。用法示例: 

list sourcelist = new list ;

combinehelper combinehelper = new

combinehelper(sourcelist);

list

result = combinehelper.findcombination(33

);

foreach (int i in

result)

找出一堆數中個數超過一半的數

問題描述 一堆數 例如6,2,2,6,3,4,6,6,6,6 總共10個,其中 6 的個數超過總數的一半5,找出這個個數超過過半的那個數。思路 從頭到尾遍歷,兩個數相同接著往後遍歷 否則刪掉這兩個數,接著往後遍歷。因為所找的那個數過半,所以不同的數相抵,抵消掉最後還會至少剩下乙個那個要找的數。圖示 ...

一堆數裡邊只有乙個出現奇數次的數,其他都出現偶數次

這是我們乙個學長出的一道題,說一堆數裡邊只有乙個出現奇數次的數,其他都出現偶數次 讓你用時間複雜度為on的演算法找出這個數。我看到的乙個簡單的方法是 開始定義乙個a 0,每輸入乙個數就跟a異或,即a a n 假設輸入數的變數是n 這樣最後得到的a就是出現奇數次的那個數 仔細想想確實是這樣,異或 相同...

在一堆數中查詢相加得某個數的組合

如題,乙個問的,我又去問其他的,再網上搜尋,發貼問,最後終於解決,不過目前還沒有明白為什麼要這樣寫,以下是 class program console.writeline 原數列 258.5,1229.1,39.6,660.3,660,660,165,165,3060,270,4.8,440,279...