FLY的背包

题目描述

FLY又要出行了,这回他带上了k只背包,一样的,他有n件物品想要带出去,每件物品的重量为a[i](而且是不可分的)。 因为FLY是个轻度完(qiang)美(po)主(zheng)义(huan)者(zhe)【假的】,他但愿每只背包的重量都可以相等。 因而你须要帮助FLY计算出每只背包最大可以带的重量。code

·(其实只有这句话是有用的:他但愿每只背包的重量都可以相等。 因而你须要帮助FLY计算出每只背包最大可以带的重量。其余话都没用,qwq )

输入

第一行两个数字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);
}

提示:搜索是惟一打法。

相关文章
相关标签/搜索