C 動態規劃 揹包類例題

2021-08-07 13:04:29 字數 1063 閱讀 3323

已知有一堆西瓜,請幫忙將這一堆西瓜分成兩堆,已知每個西瓜的重量,現在要求分成兩堆的西瓜的重量的差最小

第一行輸入西瓜數量n (1 ≤ n ≤ 20)

第二行有n個數,w1, …, wn (1 ≤ wi ≤ 10000)分別代表每個西瓜的重量

輸出分成兩堆後的質量差

5

5 8 13 27 14

3 此題好想的方法是:可以轉化為01揹包問題:假設總重是v,求揹包容量為v/2的最大價值,這裡價值就是重量

【解法1】

#include using namespace std;

int n, v, hfv;

int v[50001], c[50001];

int f[50001];

int main()

hfv = v/2;

for(int i=1; i<=n; i++)

for(int j=hfv; j>=v[i]; j--)

f[j] = max(f[j], f[j-v[i]] + c[i]);

if(v % 2 == 0) cout << (hfv - f[hfv]) * 2 << endl;

else cout << v - 2 * f[hfv] << endl;

return 0;

}

【解法2】bool f[j]表示能不能裝滿為重j的物品

#include using namespace std;

int n, v, hfv;

int v[50001];

bool f[50001];

int main()

if(v % 2 == 0) cout << (hfv - maxv) * 2 << endl;

else cout << v - 2 * maxv << endl;

return 0;

}

這一題是01揹包的經典變形:滿箱揹包

動態規劃揹包問題(例題)

物品編號 1 2 3 4 物品體積 2 3 4 5 物品價值 3 4 5 6 求容積為8的揹包能裝的最大價值為多少?動態規劃解題步驟 1 確定狀態 注意 動態規劃一般要開陣列,首先要明確陣列的每個元素所代表的意義。確定狀態需要兩個意識 1 最後一步 2 子問題。2 轉移方程的確定 3 初始化條件和邊...

動態規劃 揹包

揹包經典問題 揹包問題01 乙個揹包容積為t 0 t 2000 現在有n 0 如下 includeusing namespace std int s 1005 bool f 3000 int main 揹包問題02 若每種物品有無限多個。從這n種物品中選取若干個裝入揹包內,使揹包所剩的空間最小。請求...

揹包(動態規劃)

一 01揹包問題 特點 每件物品僅有一件,可以選擇放與不放 有件物品和乙個容量為 的揹包。第 件物品的費用是 價值是 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。用子問題定義狀態 f i v max f i 1 v f i 1 v c i w i 注意有意義當且僅當存...