有乙個數列,要採取怎樣的劃分方法把它分成
2個數列,使得
2個數列的各自之和的差最小。
比如乙個數列(
5,8,13,27,14
),通過分成(
5,13,14
)和(8,27
),這樣
2個數列各自的和再作差就等於
35-32=3
,這樣差值最小。
暫時有兩種想法可以做,現在只給出第一種的**(c#)
1. 動態規劃
(1)就是根據輸入陣列的長度(n),把這個問題看成乙個n歩動態規劃的問題。
(2)對於動態規劃,需要有狀態變數記錄當前的狀態(這裡有當前歩i,前面的選擇情況,當前的差值);
(3)對於每一步的選擇有兩種,比如第i歩時,選擇將第i個數放入陣列1或者陣列2。
最後的實現就是遞迴狀態變數得到。
2. 列舉所有可能的差值
(1) 對於有限的陣列,算出所有數分成兩組可能的絕對值是可能的。
(2) 通過遞迴的形式,將長度大於2的陣列,劃分為兩個較小的陣列,然後分別計算它們可能得到的差值。然後再定義,兩個子陣列差值合併的計算方法和陣列長度為2時的計算方法即可。
(3) 對於兩個子陣列差值合併的計算,把差值按照一定順序排列,建立每個差值和整個陣列分組的對應關係,所以不用記錄每個差值對應的分組。
最後的實現就是遞迴陣列得到。
struct choiceset
public static int minval = 0, choicefinal = 0;
static void main(string args)
choiceset cs0;
cs0.choice = 1;
cs0.value = 0;
cs0.position = 0;
stepone(originallist, cs0);
writeresult(originallist, choicefinal);
console.readkey();
}static void writeresult(listli, int choice)
,]", li[li.count-1-i], choice % 2 + 1);
choice=(choice-choice%2)/2;
}console.writeline("the difference is .",minval);
}static void stepone(listli, choiceset cs)
else if (cs.position < li.count - 1)
else
}else}}
}static int getnum(string s)
return sum * sign;
}
最小子陣列
給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。注意事項 子陣列最少包含乙個數字 您在真實的面試中是否遇到過這個題?yes 哪家公司問你的這個題?airbnb linkedin amazon cryptic studios dropbox epic systems tinyco hedv...
44 最小子陣列
給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。注意事項 子陣列最少包含乙個數字 您在真實的面試中是否遇到過這個題?yes 樣例給出陣列 1,1,2,1 返回 3 思路和最大子陣列一樣,使用貪心演算法,貪心選擇是採用從頂向下 以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為乙...
44 最小子陣列
給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。給出陣列 1,1,2,1 返回 3 子陣列最少包含乙個數字 思路 從第乙個數開始累加,但是如果到第n個數開始和為正數,那麼就沒必要繼續將後面的陣列元素繼續相加,因為無論第n 1個數為正還是為負,和前n個數的和想加以後都會讓總和變得更大。因此...