已知有一堆西瓜,請幫忙將這一堆西瓜分成兩堆,已知每個西瓜的重量,現在要求分成兩堆的西瓜的重量的差最小
第一行輸入西瓜數量n (1 ≤ n ≤ 20)
第二行有n個數,w1, …, wn (1 ≤ wi ≤ 10000)分別代表每個西瓜的重量
輸出分成兩堆後的質量差
55 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 注意有意義當且僅當存...