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

提示:搜索是唯一打法。

原文地址:https://www.cnblogs.com/wangshengjun/p/11220635.html