時間限制:
3000 ms | 記憶體限制:
65535 kb
難度: 2 描述
今天是陰曆七月初五,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)分別代表每個西瓜的重量
輸出輸出分成兩堆後的質量差
樣例輸入
55 8 13 27 14
樣例輸出
3
解題思路:
這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或者不放,故稱01揹包;
用子問題定義狀態:即f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程便是:
f[i][v]=max[v],f[i-1][v-c[i]]+w[i]}.可以壓縮空間,f[v]=max;
這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:「將前i件物品放入容量為v的揹包中」這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為乙個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為「前i-1件物品放入容量為v的揹包中」,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為「前i-1件物品放入剩下的容量為v-c[i]的揹包中」,此時能獲得的最大價值就是f [i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。
ac**:
#include
#include
#define max(a,b)(a>b?a:b)//不用函式,會超時
intmain()
v=sum;
v>>=1;
for(i=0;i
} printf("%d\n"
,sum-2*dp[v]);
} return
0;
}
nyoj 325 zb的生日(01揹包)
題目鏈結 題目描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準備把西瓜送給c小加和never的時候,遇到了乙個難題...
nyoj 325 zb的生日 01揹包 dfs
時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。當他準...
NYOJ325 zb的生日 01揹包,深搜DFS
題目 時間限制 3000 ms 記憶體限制 65535 kb 難度 2 描述 今天是陰曆七月初五,acm隊員zb的生日。zb正在和c小加 never在武漢集訓。他想給這兩位兄弟買點什麼慶祝生日,經過調查,zb發現c小加和never都很喜歡吃西瓜,而且一吃就是一堆的那種,zb立刻下定決心買了一堆西瓜。...