深度優先搜尋 動態規劃 01揹包類似問題

2021-07-15 05:36:12 字數 997 閱讀 2125

描述

今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加、never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準備把西瓜送給c小加和never的時候,遇到了乙個難題,never和c小加不在一塊住,只能把西瓜分成兩堆給他們,為了對每個人都公平,他想讓兩堆的重量之差最小。每個西瓜的重量已知,你能幫幫他麼?

輸入 多組測試資料(<=1500)。資料以eof結尾 第一行輸入西瓜數量n (1 ≤ n ≤ 20) 第二行有n個數,w1, …, wn

(1 ≤ wi ≤ 10000)分別代表每個西瓜的重量 輸出 輸出分成兩堆後的質量差

樣例輸入

5 5 8 13 27 14

樣例輸出

3

最開始尋思著用貪心的思想來解決,將重量按照順序從大到小排序,把每一件物品放入兩堆中的某乙個,使得重量差最小。使用區域性最優,達到全域性最優的效果。然而,貪心法在這裡是不起作用的,會存在錯解。

目前有乙個想法,有沒有可能進行數學建模後,運用凸函式理論來證明貪心演算法不正確的情形?先mark乙個,有進展再更。

下面給出兩種正確解法。

其實就是簡單的暴力列舉法,把所有可能性都找出來,然後求得差值最小的那種情況。

對於列舉,要考慮到的就是每件物品只有兩種狀態,要麼裝入揹包,要麼不裝入揹包。那麼,進行遞迴搜尋時,每一層就只考慮這兩種狀態。詳見**。

#include#includeint w[22],sum=0,n=0,minmize=10000,temp;

int dfs(int cur,int total)

int main()

int main()

}temp=(sum-weight[temp])-weight[temp];

printf("%d\n",temp);

}return 0;

}

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

0 1揹包(動態規劃)

題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...