如題,比如有一堆數: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這段**除開一些封裝/初始化的部分之外,也沒幾行了,真正有用的就是find方法,遞迴的**就是簡潔。用法示例: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
; }
}
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...