FLY的背包
题目描述
FLY又要出行了,这回他带上了k只背包,同样的,他有n件物品想要带出去,每件物品的重量为a[i](并且是不可分的)。 由于FLY是个轻度完(qiang)美(po)主(zheng)义(huan)者(zhe)【假的】,他希望每只背包的重量都能够相等。 于是你需要帮助FLY计算出每只背包最大能够带的重量。
·(其实只有这句话是有用的:他希望每只背包的重量都能够相等。 于是你需要帮助FLY计算出每只背包最大能够带的重量。其他话都没用,qwq )
输入
第一行两个数字n,k,代表物品个数与背包个数。
第二行n个数字代表每件物品的重量。
n<=10,每只背包重量不大于20. 【DFS的范围呵呵呵qwq】
输出
一个数字,即每只背包能分配得到的最大重量。
样例输入
10 4
3 5 3 7 4 3 5 2 8 1
样例输出
10
提示
样例解释:
10 4
3 5 3 7 4 3 5 2 8 1
10件物品分4个背包,每个背包重量一样,最大可以分配重量为10
背包1:3 7
背包2:3 3 4
背包3:5 5
背包4:2 8
思路
看看就知道是搜索,不要看成背包哦,因为这道题他说他希望每只背包都要相等,如果其中一只不相等的就不能选了。这样就能干了背包。。。
搜索其实是可以的,正解也是搜索。不停的去枚举,每次的话要么选,要么不选。
选也可以分为一些情况:当前没选的,和虽然选了,但是还是要用的那一种背包。操作之后也要标记一些。然后减掉背包重量。在继续搜索即可。
给出关键代码:
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);
}