FLY又要出行了,這回他帶上了k只揹包,一樣的,他有n件物品想要帶出去,每件物品的重量爲a[i](而且是不可分的)。 因爲FLY是個輕度完(qiang)美(po)主(zheng)義(huan)者(zhe)【假的】,他但願每隻揹包的重量都可以相等。 因而你須要幫助FLY計算出每隻揹包最大可以帶的重量。code
第一行兩個數字n,k,表明物品個數與揹包個數。
第二行n個數字表明每件物品的重量。
n<=10,每隻揹包重量不大於20. 【DFS的範圍呵呵呵qwq】class
一個數字,即每隻揹包能分配獲得的最大重量。搜索
10 4 3 5 3 7 4 3 5 2 8 1
10
樣例解釋:
10 4
3 5 3 7 4 3 5 2 8 1co
10件物品分4個揹包,每一個揹包重量同樣,最大能夠分配重量爲10
揹包1:3 7
揹包2:3 3 4
揹包3:5 5
揹包4:2 8數字
看看就知道是搜索,不要當作揹包哦,由於這道題他說他但願每隻揹包都要相等,若是其中一隻不相等的就不能選了。這樣就能幹了揹包。。。枚舉
搜索實際上是能夠的,正解也是搜索。不停的去枚舉,每次的話要麼選,要麼不選。return
選也能夠分爲一些狀況:當前沒選的,和雖然選了,可是仍是要用的那一種揹包。操做以後也要標記一些。而後減掉揹包重量。在繼續搜索便可。void
給出關鍵代碼:
if(fg == 0) { if(t == 1) { flag = 1; return; } dfs(1 , gu , t-1); return; }
不選的狀況:當沒標記的時候也要作,也要把這個容量給減掉。繼續搜索。
給出關鍵代碼:
if(!f[i]) { f[i] = 1; dfs(i+1,fg-a[i],t); f[i] = 0; }
而後就繼續搜索便可。
dfs(i+1,fg,t);
關鍵搜索部分:
gu爲答案,fg爲揹包重量,t爲個數。
void dfs(int i,int fg,int t) { if(fg < 0 || flag || i>n+1)return; if(fg == 0) { if(t == 1) { flag = 1; return; } dfs(1 , gu , t-1); return; } if(!f[i]) { f[i] = 1; dfs(i+1,fg-a[i],t); f[i] = 0; } dfs(i+1,fg,t); }