將乙個陣列分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於陣列,可以分成和,使得這兩部分的差值最小。
思路:
這個問題可以轉化為求陣列的乙個子集,使得這個子集中的元素的和盡可能接近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...