zoukankan      html  css  js  c++  java
  • 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);
    }
    

    提示:搜索是唯一打法。

  • 相关阅读:
    学习笔记10.28
    学习目标
    ajax传值修改数据
    php 4种传值方式
    01-17权限管理
    01-16作业:文件管理
    01-15文件操作
    01-12文件上传
    1-6 号 详情
    ajax登陆提示
  • 原文地址:https://www.cnblogs.com/wangshengjun/p/11220635.html
Copyright © 2011-2022 走看看