DFS进阶——买瓜

2024-03-22 14:44
文章标签 进阶 dfs 买瓜

本文主要是介绍DFS进阶——买瓜,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

买瓜
题目分析

使用dfs依次考虑每一个瓜,我是切开还是不切还是直接不买。这里u表示我当前考虑的瓜,res表示当前获得瓜的总重量,count表示切开瓜的次数。

dfs(u+1,res,count);//不买
dfs(u+1,res+a[u]/2,count+1);//切
dfs(u+1,res+a[u],count);//不切

考虑终点状态就是前n个瓜都遍历完了或者res恰好等于瓜的总重量的一半。

if(res == m){flag = 1;min = Math.min(min,count);
}
if(u>n)return;

考虑剪枝,如果当前瓜的切开次数大于等于了我之前记录的最小值,那么就返回。如果当前瓜的重量已经超过了瓜的总重量的一半,那么就返回。还可以考虑什么?如果当前未遍历到的瓜的总重量加到当前已经拥有的总重量上小于瓜的总重量的一半,说明我后面即便全要了也不会使res恰好等于瓜的总重量的一半,那么就返回。

if(res+sum[u]<m||res>m||count >= min){//剪枝return ;
}

这里的sum[u]就是一个后缀和,表示第u个瓜到第n个瓜的总重量。我们可以在dfs之前预处理出来。

sum = new long[n+1];
for(int i = n-1; i >=0; i --){sum[i] = sum[i+1]+a[i];
}

最后考虑我们希望尽快的凑齐瓜的总重量的一半,其实可以优先选择重量大的瓜,所以我们可以对瓜的重量进行从大到小的排序。

Arrays.sort(a, new Comparator<Long>() {@Overridepublic int compare(Long o1, Long o2) {return (int) (o2-o1);}
});
题目代码
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main{static int n ;static int m;static Long []a ;static long []sum;static int flag = 0;static int min = Integer.MAX_VALUE;public static void main(String[] args) {Scanner s = new Scanner(System.in);n = s.nextInt();m = s.nextInt()*2;a = new Long [n];for(int i = 0; i < n; i ++){a[i] = s.nextLong()*2;}Arrays.sort(a, new Comparator<Long>() {@Overridepublic int compare(Long o1, Long o2) {return (int) (o2-o1);}});sum = new long[n+1];for(int i = n-1; i >=0; i --){sum[i] = sum[i+1]+a[i];}dfs(0,0,0);if(flag==1)System.out.println(min);elseSystem.out.println(-1);}public static void dfs(int u,long res,int count){//u表示选择过的西瓜数,res表示目前有的重量,count表示切瓜次数if(res == m){flag = 1;min = Math.min(min,count);}if(u>n)return;if(res+sum[u]<m||res>m||count >= min){//剪枝return ;}dfs(u+1,res,count);//不买dfs(u+1,res+a[u]/2,count+1);//切dfs(u+1,res+a[u],count);//不切}
}

这篇关于DFS进阶——买瓜的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/835500

相关文章

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念