NYOJ 325 zb的生日(01揹包模板)

2021-07-16 12:44:11 字數 1322 閱讀 1903

時間限制:

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)分別代表每個西瓜的重量

輸出輸出分成兩堆後的質量差

樣例輸入

5

5 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立刻下定決心買了一堆西瓜。...