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); }