超级书架 2(DFS)_c_uizrp_dzjopkl的博客-程序员秘密

技术标签: DFS  递归  基础题  

题面(from luogu)
超级书架2
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。 所有N(1 <= N <= 20)头奶牛都有一个确定的身高H_i(1 <= H_i <= 1,000,000 - 好高的奶牛>_<)。设所有奶牛身高的和为S。书架的 高度为B,并且保证1 <= B <= S。 为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不象演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。 塔叠得越高便越不稳定,于是奶牛们希望找到一种方案,使得叠出的塔在高度不小于书架高度的情况下,高度尽可能小。你也可以猜到你的任务了:写一个程序,计算奶牛们叠成的塔在满足要求的情况下,最少要比书架高多少。

输入格式:
* 第1行: 2个用空格隔开的整数:N 和 B * 第2..N+1行: 第i+1行是1个整数:H_i
输出格式:
* 第1行: 输出1个非负整数,即奶牛们叠成的塔最少比书架高的高度
* 样例.in
* 5 16
3
1
3
5
6
样例.out
1
输出说明:
我们选用奶牛1、3、4、5叠成塔,她们的总高度为3 + 3 + 5 + 6 = 17。任何方案都无法叠出高度为16的塔,于是答案为1。

题目分析
我们可以生成出关于它的全排列
大体框架略

代码

#include <bits/stdc++.h>
using namespace std;

int vis[30],a[30],b[30],n,h,total1,total,t;    //vis数组是断定那些数访问过了,a是工具数组,b是存全排列的

bool cmp(int a,int b)    //排序的函数
{
    return a > b;     //从大到小排
}

void search(int k,int step)     //k是生成的全排列到那个数了,step是上一次搜到哪里了(可以有效减少时间,并且去重)
{
    if (k == t+1)    //全排列填完了
        {
            for (int  i = 1; i <= t; i++)     //累一下和
                total1+=a[b[i]];

            if (total1 >= h && total == 0) total=total1;    //如果不小于h且total是第一次,记下来
                else            //反之
                    total = min(total,total1);   //去其中小的
        }
            else     //反之,继续找
                {
                    for (int i = step; i <= n; i++)    //开始填全排列
                        if (vis[i] == 0)       //这个数没有用过
                            {
                                vis[i] = 1;     //打标记
                                b[k] = i;       //记下来
                                search(k+1,i);     //全排列填了一个数了+1,step从当前开始
                                vis[i] = 0;      //回溯
                            } 
                }
}

int main()
{
    cin>>n>>h;
    for (int i = 1; i <= n; i++)    //输入
        cin>>a[i];

    sort(a+1,a+n+1,cmp);            //从大到小排一下,有一定优化作用

    for (int i = n; i >= 1; i++)      //数据1有坑,所以要在这里填一下
        {
            if (a[i] >= h)      //如果不用加,本来就有比h大的
                {
                    cout<<a[i]-h;    //直接输出
                    return 0;         //推0
                }
        }
     //注意,这是要倒着来的,因为是从大到小排的,有一定优化作用

    for (int i = 1; i <= n; i++)    //所有段都要来一遍
        {
            t=i;        //i的值需要一个数存,不然会重复

            if (total == h) break;    //优化,找到最优解了,直接退出

            search(1,1);     //开搜(都从第一个开搜)
        }

    cout<<total-h;    //输出

    return 0;    //完美的结束程序
} 
                                                **蒟蒻新星c_uizrp_dzjopkl原创**

感觉这一题的写法更之前写过的一题“选数”好像,有兴趣的可以看一下我的博客(凑一下点击量) https://blog.csdn.net/c_uizrp_dzjopkl/article/details/81839301

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c_uizrp_dzjopkl/article/details/81872464

智能推荐

Git_左直拳的博客-程序员秘密

初次使用了一下GIT,没有成功。但haish

解决router-link在ie下不跳转_fairyIer的博客-程序员秘密

在IE11浏览器中,router-link的跳转是失效的,主要是因为当url的hash变化的时候,浏览器没有做出相应的反应。这时候需要做一个兼容处理,当浏览器是IE11时手动给url加一个hashChange事件。解决,在vue项目的main.js里面加上这段:if ( '-ms-scroll-limit' in document.documentElement.style &amp...

dubbo序列化问题(二)hession2与kryo切换_lipengxs的博客-程序员秘密

dubbo提供了好几种序列化方式,一般我们都是用的是默认的hession2,而dubbox为我们增加了kryo和fst许了方式,主要体现在速度快,占用内存小,然后我们将序列化配置改为是用kryo:&amp;lt;dubbo:protocol name=&quot;dubbo&quot; serialization=&quot;kryo&quot;/&amp;gt;   但是是用一段时间后遇到了不少问题,其中最困扰人的是不兼容以前的...

Structured Bird’s-Eye-View Traffic Scene Understanding from Onboard Images翻译_structured bird鈥檚-eye-view traffic scene understan_zzzzz忠杰的博客-程序员秘密

摘要自主导航需要道路网络的结构化表示和其他交通代理的实例识别。由于交通场景是在地平面上定义的,因此这与鸟瞰视图(BEV)中的场景理解相对应。然而,自动驾驶汽车的车载摄像头通常水平安装,以便更好地观察周围环境,这使得这项任务非常具有挑战性。在这项工作中,我们研究了如何从单个车载摄像头图像中提取一个以BEV坐标表示局部道路网络的有向图的问题。此外,我们还证明了该方法可以推广到BEV平面上的动态目标检测。检测到的对象的语义、位置和方向以及道路图有助于全面理解场景。这种理解对于下游任务(如路径规划和导航)至关重要

如何在VMware虚拟机上绑定Linux双网卡配置_Linux资源站的博客-程序员秘密

导读 分享一个关于使用VMware虚拟机Linux双网卡绑定配置详细步骤 一、VMware虚拟机添加一个网络适配器。选择自己需要的模式类型二、启动虚拟机,配置网卡按原先配置网卡的方式配置完(ip地址及默认网关还有网卡名不能跟原先的一样)重启所有网卡(service network restart)后检查网卡三、测试新增网卡环境关闭原先网卡,检查新增网卡是否能与外网链接ping外网后提示无法识别设备(unknown host baido.com),表示无d

随便推点

scrapy爬虫框架介绍与实战_小熊simon学IT的博客-程序员秘密

属于scrapy框架的一个子类,其最大的有点就是使用链接提取器,根据正则匹配网页链接,高效爬取全站网页数据,自动化实现翻页功能。这里登录了网页加了cookie信息import osimport sys# 网页链接url只有页码不同写正则匹配rules = ()# company = scrapy.Field() # 公司名称# 定位元素大类20个职位# 接受meta传入的参数#company = response.meta['company']# 公司名称。

tensorflow学习笔记——MNIST数据集分类_tfadam mnist数据集分类_红鱼鱼的博客-程序员秘密

首先在这个网站下载MNIST数据集。下载后的数据如图所示:压缩包不需要解压,直接使用。里面是二进制文件,因为用二进制文件训练网络比较快。代码如下:import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data#载入数据mnist = input_data.read_data_s...

java中的(private,protected,public,缺省类)的访问能力_INullPoint的博客-程序员秘密

java中的(private,protected,public,缺省类)的访问能力

C/C++ ——分别输出unsigned int四个字节内容_HHT0506的博客-程序员秘密

目标将4字节大小变量拆开查看各自内容,弄清4字节数据存放顺序。代码及测试 unsigned int temp=0x01ff02fe; printf("%d\n", &amp;temp); unsigned int address; scanf_s("%d", &amp;address); printf("%d\n", *((unsigned char *)address));分析相比于之前的文章(C语言--输入地址,输出该地址内容),修改了temp值以及最后一行地址的类型.

SQL语句--神通(DDL、DCL、DML)_神通数据库sql语言参考手册_小白笔记行的博客-程序员秘密

2. 支持DDL语句的审计,数据库表创建表、删除表、修改表结构(DDL)1)新建模式:create schema test;1)创建表:create table test.table1 (id int primary key, a varchar(255));2)增加表字段:alter table test.table1 add column a2 varchar(255);3)字段改名:ALTER TABLE test.table1 rename column A TO A

rem适应不同屏幕_有谁活着不像是一场炼狱的博客-程序员秘密

1.先说说几个前端常用的几个单位的概论:1、px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选。Windows系统默认是96dpi,Apple系统默认是72dpi。 2、em(相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位...