將陣列分成兩部分,使得這兩部分的和的差最小

2021-07-29 12:55:21 字數 1069 閱讀 8966

將乙個陣列分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於陣列,可以分成和,使得這兩部分的差值最小。

思路:

這個問題可以轉化為求陣列的乙個子集,使得這個子集中的元素的和盡可能接近sum/2,其中sum為陣列中所有元素的和。這樣轉換之後這個問題就很類似0-1揹包問題了:在n件物品中找到m件物品,他們的可以裝入揹包中,且總價值最大不過這裡不考慮價值,就考慮使得這些元素的和盡量接近sum/2。

下面列狀態方程

dp[i][j]表示前i件物品中,總和最接近j的所有物品的總和,其中包括兩種情況:

第i件物品沒有包括在其中

第i件物品包括在其中

如果第i件物品沒有包括在其中,則dp[i][j] = dp[i-1][j]

如果第i件物品包括在其中,則dp[i][j] = dp[i-1][j-vec[i]]

當然,這裡要確保j-vec[i] >= 0。

所以狀態轉移方程為:

dp[i][j] = max(dp[i-1][j],dp[i-1][j-vec[i]]+vec[i]);

c++**實現:

#include

#include

#include

using

namespace

std;

//返回兩部分的差值

int diff(vector

& vec)

vector

> dp;

for (int i = 0; i <= len; i++)

dp.push_back(tmp);

}for (int i = 1; i <= len; ++i)

}return sum - 2*dp[len][sum / 2];

}int main()

; cout

<< diff(vec) << endl;

system("pause");

return

0;}

給定值將鍊錶分割成兩部分

題目描述 給定值x將鍊錶分割成兩部分,比x小的在鍊錶的前面部分,比x大的在鍊錶的後面部分,不能改變原來的資料結構 思路 public class solution6 listnode smalllist new listnode 0 listnode shead smalllist listnode...

組成計算機指令的兩部分是

計算機指令格式通常包含操作碼和運算元 位址碼 兩部分。計算機指令就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是計算機的工作過程。控制器靠指令指揮機器工作,人們用指令表達自己的意圖,並交給控制器執行。推薦學習 web前端 教程 原理控制器靠指令指揮機器工作,人們用...

陣列以n分為大於小於n的左右兩部分

給定乙個陣列arr,和乙個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 思路 兩個指標 void part num int arr,int num,int len now void part num2 int arr,in...