poj_3977 折半枚举

题目大意

    给定N(N<=35)个数字,每个数字都<= 2^15. 其中一个或多个数字加和可以得到s,求出s的绝对值的最小值,并给出当s取绝对值最小值时,需要加和的数字的个数。

题目分析

    需要枚举集合的所有情况,2^35,会超时。考虑使用折半枚举的方法,考虑前 N/2个数字构成的集合S1,在S1中进行所有情况枚举,复杂度为 2^17,并将所有可能的和sum以及构成和sum需要的数字个数count存放在map M中;然后在S2中进行所有情况的枚举,复杂度为2^17,对于每种情况的sum2,在M中查找 -sum2的位置,在该位置前后位置处进行查找,求和的最小值。 
    还需要考虑,当s只有S1中的数字构成或者s只有S2中的数字构成,或者s由S1和S2中的数字构成的三类情况。 
    总的时间复杂度为 O(2^17 + 2^17*log(2^17)) = O(2^22)

实现(c++)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>
#include<map>
using namespace std;long long int ll_abs(long long int n){if (n >= 0)return n;return -n;
}
long long int an[40];map<long long int, int> sum_map;
int main2(){int n;while (scanf("%d", &n) && n){map<long long int, int>::iterator it;sum_map.clear();for (int i = 0; i < n; i++){scanf("%lld", &an[i]);}long long int min_sum = ll_abs(an[0]);int min_count = 1;int m = n / 2;for (int i = 0; m > 0 && i < (1 << m); i++){long long int sum = 0;int count = 0;int t = i;for (int k = 0; k < m; k++){if (t & 1){sum += an[k];count++;}t >>= 1;}if (count == 0)continue;if (sum_map.find(sum) != sum_map.end()){sum_map[sum] = min(sum_map[sum], count);}elsesum_map[sum] = count;if (ll_abs(sum) < min_sum){min_sum = ll_abs(sum);min_count = count;}else if (ll_abs(sum) == min_sum){min_count = min(min_count, count);}}m = n / 2 + n % 2;for (int i = 0; i < (1 << m); i++){long long int sum = 0;int count = 0;int t = i;for (int k = 0; k < m; k++){if (t & 1){sum += an[n / 2 + k];count++;}t >>= 1;}if (count == 0)continue;if (ll_abs(sum) < min_sum){min_sum = ll_abs(sum);min_count = count;}else if (ll_abs(sum) == min_sum){min_count = min(min_count, count);}it = sum_map.lower_bound(-sum);if (it != sum_map.end()){long long int s = sum + it->first;if (ll_abs(s) < min_sum){min_sum = ll_abs(s);min_count = it->second + count;}else if (ll_abs(s) == min_sum){min_count = min(min_count, it->second + count);}}if (it != sum_map.begin()){--it;long long int s = sum + it->first;if (ll_abs(s) < min_sum){min_sum = ll_abs(s);min_count = it->second + count;}else if (ll_abs(s) == min_sum){min_count = min(min_count, it->second + count);}}}printf("%lld %d\n", min_sum, min_count);}return 0;
}

 

转载于:https://www.cnblogs.com/gtarcoder/p/4909448.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 应用更新和在服务器下载android应用

下载android应用有两种表现形式&#xff1a;一种是交给Android系统的下载管理器;另一种是自己去监控下载。 1.使用Android下载管理器下载应用并安装 public class UpdateService extends Service {// 安卓系统下载管理类DownloadManager manager;// 接收下载完的广播DownloadCo…

Linux如何查看进程、杀死进程、启动进程等常用命令

转载自&#xff1a;http://blog.csdn.net/wojiaopanpan/article/details/7286430/ 关键字: linux 查进程、杀进程、起进程 1.查进程 ps命令查找与进程相关的PID号&#xff1a; ps a 显示现行终端机下的所有程序&#xff0c;包括其他用户的程序。 ps -A 显示所有程…

(原创)c#学习笔记06--函数02--变量的作用域01--其他结构中变量的作用域

6.2 变量的作用域 在上一节中&#xff0c;读者可能想知道为什么需要利用函数交换数据。原因是C#中的变量仅能从代码的本地作用域访问。给定的变量有一个作用域&#xff0c;访问该变量要通过这个作用域来实现。 在上一节中&#xff0c;读者可能想知道为什么需要利用函数交换数据…

禁用应用中Android系统的导航栏(特别是平板)

由于公司项目是在全屏下的&#xff0c;所有界面都是全屏&#xff0c;唯有弹出提示框的时候&#xff0c;会出现系统的导航栏&#xff0c;由于是平板&#xff0c;导航栏信息比较多&#xff0c;该项目属于永不让用户进入原系统的项目。所以有导航栏&#xff0c;就让用户有了机会进…

spring使用注解@Scheduled执行定时任务

最近做的项目中遇到了用spring中Schedule注解执行定时任务的功能&#xff0c;这里简单记录一下。 首先在applicationContext.xml中进行配置&#xff1a; xmlns 加下面的内容 xsi:schemaLocation加下面的内容 最后我们的task任务扫描注解 需要注意的几点&#xff1a; 1、spring的…

关于dialog的一点东西

今天开发一个上传照片的小功能&#xff0c;对弹出的Dialog的一些用法查找了下&#xff0c;记录下来以后备用。 1.设置dialog标题居中: 在style中配置如下代码 <style name"UploadDialog" parent"android:style/Theme.Dialog"> <item …

DIY Ruby CPU 分析 Part II

【编者按】作者 Emil Soman&#xff0c;Rubyist&#xff0c;除此之外竟然同时也是艺术家&#xff0c;吉他手&#xff0c;Garden City RubyConf 组织者。本文是 DIY Ruby CPU Profiling 的第二部分。本文系 OneAPM 工程师编译整理。 在第一部分中我们学习了 CPU 分析的含义和进行…

spring注解 @Scheduled(cron = 0 0 1 * * *)的使用来实现定时的执行任务

<span style"font-size:14px;">初次接触定时类的小程序&#xff0c;还是走了很多的弯路&#xff0c;如今终于搞定了&#xff0c;总结如下&#xff1a;</span> <span style"font-size:14px;">import com.activityvip.api.service.Securit…

在Oracle里,表的别名不能用as,列的别名可以用as

列的别名也可以不用as&#xff0c;如&#xff1a;select t.a xxx from table t在Oracle数据库中&#xff0c;数据表别名是不能加as的&#xff0c;例如&#xff1a; select a.appname from appinfo a;-- 正确 select a.appname from appinfo as a;-- 错误 注释&#xff1a;这…

Android自定义RadioButton

今天公司项目中需要完成一个效果&#xff0c;首先是要用自己的图片&#xff0c;然后文字在按钮图片的左边。 1.使文字在图片的左边&#xff0c;有两种方法&#xff1a; 第一种&#xff0c;设置radioButton的属性&#xff1a; <span style"font-size:24px;">a…

MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔

做了一个简答的小项目&#xff0c;其中遇到了一些数据库的sql使用技巧总结如下&#xff1a; DATE_ADD() 函数向日期添加指定的时间间隔。 当前表所有数据都往后增加一天时间&#xff1a; UPDATE ACT_BlockNum SET CreateTime DATE_ADD(CreateTime, INTERVAL 1 DAY); 当前…

Android蓝牙4.0的数据通讯

我在两家公司都用到了app与BLE设备通讯&#xff0c;当时也是什么都不懂&#xff0c;在网上各种搜索&#xff0c;各种查资料&#xff0c;总算弄出来了。在这里记录下来&#xff0c;希望对有需要的人有些帮助。 1.检测手机是否支持蓝牙4.0&#xff08;一般手机4.3以上的android系…

荐 Intellij IDEA创建Maven Web项目(带有webapp文件夹目录的项目)

转载自&#xff1a;点击打开链接 在创建项目中&#xff0c;IDEA提供了很多项目模板&#xff0c;比如Spring MVC模板&#xff0c;可以直接创建一个基于Maven的Spring MVC的demo&#xff0c;各种配置都已经设定好了&#xff0c;直接编译部署就可以使用。 最开始自己创建maven we…

iOS设计模式 - 迭代器

iOS设计模式 - 迭代器 原理图 说明 提供一种方法顺序访问一个聚合对象中的各种元素&#xff0c;而又不暴露该对象的内部表示。 源码 https://github.com/YouXianMing/iOS-Design-Patterns // // Node.h // IteratorPattern // // Created by YouXianMing on 15/10/26. // …

Android程序杀死自己的进程和其他程序进程方法

1.获取程序进程ID&#xff1b; int pidandroid.os.Process.myPid(); android.os.Process..killProcess(pid); 2.杀死其他程序进程&#xff1b; ActivityManager manager(ActivityManager)getSystemService(ACTIVITY_SERVICE); manager.killBackgroundProcesses("packa…

maven依赖关系中Scope的作用

Dependency Scope 在POM 4中&#xff0c;<dependency>中还引入了<scope>&#xff0c;它主要管理依赖的部署。目前<scope>可以使用5个值&#xff1a; * compile&#xff0c;缺省值&#xff0c;适用于所有阶段&#xff0c;会随着项目一起发布。 * provided&…