首页 > 其他分享 ><数组中选取子集达到某一目标>问题总结

<数组中选取子集达到某一目标>问题总结

时间:2023-07-06 14:48:36浏览次数:29  
标签:总结 goal nums int 问题 abs lp ans

这类问题主要分为两种类型:

  • 目标值明确,可以把目标值看出背包容量,数组值看做物品,转成背包问题
  • 目标值不明确,容量不知道,不能用背包,只能枚举子集的和

类型一:

类型二:

Leetcode 1555

题目描述

给你一个整数数组 nums 和一个目标值 goal

你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal 。也就是说,如果子序列元素和为 sum ,你需要 最小化绝对差 abs(sum - goal)

返回 abs(sum - goal) 可能的 最小值

  • 1 <= nums.length <= 40
  • -107 <= nums[i] <= 107
  • -109 <= goal <= 109

解题思路

这道题最后要求的试和与目标之间的差距尽可能地小,所以其实目标是不确定的,属于类型2

再观察数据范围个数为40个,考虑把他分成两个数组处理,2的20次方复杂度刚好够

采用状态压缩的方式存储信息

采用双指针逼近目标值

#include<bits/stdc++.h>

using namespace std ;

int ans = 0x7fffffff ;
int nums[41],numsSize,goal ;
int lp[1<<20],rp[1<<20] ;

int main()
{
    scanf("%d",&numsSize) ;
    for(int i=1;i<=numsSize;++i) scanf("%d",&nums[i]) ;
    scanf("%d",&goal) ;

    int part = numsSize/2 ;
    int Rpart = numsSize-(part+1)+1 ;
    //L:1~part  R: part+1~numsSize ;
    for(int i=0;i<(1<<part);++i)
    {
        for(int j=1;j<=part;++j)
        {
            if((1&(i>>(j-1)))==0) continue ;
            lp[i]+=nums[j] ;
        }
        ans = min(ans,abs(goal-lp[i])) ;
    }
    
    for(int i=0;i<(1<<Rpart);++i)
    {
        for(int j=1+part;j<=numsSize;++j)
        {
            if((1&(i>>(j-1-part)))==0) continue ;
            rp[i]+=nums[j] ;
        }
        ans  = min(ans,abs(goal-rp[i])) ;
    }
    sort(lp,lp+(1<<part)) ;
    sort(rp,rp+(1<<Rpart)) ;
    
    int i=0,j=(1<<Rpart)-1 ;
    while(i<(1<<part)&&j>=0)
    {
        int sum = lp[i]+rp[j] ;
        ans = min(ans,abs(goal-sum)) ;
        if(sum<goal) i++ ;
        else if(sum>goal) j-- ;
        else break ;
    }
    printf("%d\n",ans) ;
    system("pause") ;
    return 0 ;
}

标签:总结,goal,nums,int,问题,abs,lp,ans
From: https://www.cnblogs.com/BoWing/p/17532072.html

相关文章

  • 记ios的input框获取焦点之后界面放大问题
    在移动端开发项目中,发现页面在使用iPhone访问的时候,点击input和textarea等文本输入框聚焦focus()时,页面会整体放大,而且失去焦点之后页面不能返回原来的样子。检查了下功能上没有什么大问题,但是页面会整体放大,而且失去焦点之后页面不能返回原来的样子。对于用户体验不是很......
  • Python怎么调中文 这个问题怎么解决?
    Python怎么调中文在使用Python处理中文文本时,我们常常会遇到一些编码和字符处理的问题。本文将介绍如何通过一些常用的方法和工具来解决这些问题,并提供代码示例来帮助读者更好地理解。问题描述假设我们有一个文本文件,其中包含了一些中文文本,我们想要对这些文本进行处理,例如统计......
  • 成功拿下Offer!Salesforce顾问岗位高频面试问题(含答案)
    前不久自由侠部落为某顶级高科技公司成功招聘了一名资深SalesforceBA,年薪颇丰。企业获得了合适的人才,候选人也拿到了满意的薪资,以及更优质的发展平台。此次招聘,印证了市场对资深业务分析师的需求。从收集需求和流程图,到确保项目交付,完成足够的测试,并对用户进行培训,业务分析师......
  • 微服务相关问题
    SpringCloud1.名词解释什么是集群?集群就是相当于将一个服务复制多份,他们每一个节点都是独立的集群可以解决什么问题?使用单个服务时,因为服务并发量有限,当并发量过大时会导致服务器宕机,使用集群就可以解决因为并发量过大的问题,因为集群的每个节点都有一个服务器......
  • Bootstrap导航栏下拉菜单不生效的问题
    Bootstrap导航栏下拉菜单不生效的问题一般来来说是导入静态文件顺序的问题,解放方案:按以下顺序导入静态文件{%loadstatic%}<scriptsrc="{%static'jQuery/jQuery.js'%}"></script><scriptsrc="{%static'bootstrap/js/bootstrap.min.js'%}&quo......
  • mysql死锁问题排查SOP
    步骤1:查看写库的隔离级别#查看隔离级别showvariableslike'%tx_isolation%'或者select@@global.tx_isolationselect@@session.tx_isolation如果隔离级别为RC,则只有行锁,没有间隙锁。死锁概率会降低很多。步骤2:查看最近一次的死锁showengineinnodbstatus这个......
  • AI数字人(虚拟人)讨论总结
    AI数字人类型和应用场景?1.二维/三维虚拟人:用于游戏、IP品牌(柳夜熙)、内容创作(http://AI.talk)等。2.真人形象数字人:用于直播卖货,营销/投流广告视频录制(Heygen)、语言学习(CallAnnie)等等。AI数字人的价值是什么?1.代替人说话,提升表达效率和营销效率。比如真人做不到24小时直播,但......
  • jenkins安装后启动项目的一些问题
    1.没有maven项目选项:需要安装maven相关插件: MavenIntegrationplugin 和PipelineMavenIntegrationPlugin2.没有SSH配置选项:需要安装插件: PublishoverSSH3.启动项目时maven一直报错:这里失败原因是用户权限问题,启动jenkins是jenkins用户,但是maven需要root权......
  • Java-基本语法回顾总结[73-84]
    redis与MySQL如何保持数据一致?1.删除redis缓存2.更新MySQL3.删除redis缓存redis的持久化机制两种持久化命令:save:阻塞性持久化,会阻塞redis主进程,直到持久化完成bgsave:非阻塞性持久化,通过新建子线程专门持久化,从而不影响redis主进程手动就是上面两种命令自动就是sa......
  • nvm安装node.js总结
    nvm安装node.js总结什么是nvm?nvm(Node.jsversionmanager)是一个命令行应用,可以协助您快速地更新、安装、使用、卸载本机的全局node.js版本。为什么要用nvm?有时候,我们可能同时在进行多个项目开发,而多个项目所使用的node版本又是不一样的,或者是要用最新的node版本进行......