首页 > 其他分享 >组装新的数组

组装新的数组

时间:2023-07-01 23:32:55浏览次数:24  
标签:min int 组装 static 数组 local

题目描述

给你一个整数 组装新的数组_用例和数组组装新的数组_java_02组装新的数组_java_02中的元素为连续整数,要求根据组装新的数组_java_02中的元素组装成新的数组组装新的数组_java_05 组装规则:

  1. 组装新的数组_java_05中元素总和加起来等于组装新的数组_用例
  2. 组装新的数组_java_05中的元素可以从组装新的数组_java_02中重复选取
  3. 组装新的数组_java_05中的元素最多只能有 1 个不在组装新的数组_java_02中,且比组装新的数组_java_02中的数字都要小(不能为负数)

输入描述

第一行输入是连续数组组装新的数组_java_02,采用空格分隔 第二行输入数字组装新的数组_用例

输出描述

输出的是组装办法数量,int 类型

备注

组装新的数组_用例_15组装新的数组_用例_16

用例

用例1

输入

2
5

输出

1
说明:只有一种组装方法,就是 [2,2,1]

用例2

输入

2 3
5

输出

2
说明:一共有两种组装方法,分别是 [2,2,1] [2,3]

题目解析

直接上代码

package com.hw;



import java.util.Arrays;
import java.util.Scanner;

public class ArrayComposer {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        int M = Integer.parseInt(in.nextLine());
        String[] split = line.split(" ");
        int[] N = new int[split.length];
        for (int i = 0; i < split.length; i++) {
            N[i] = Integer.parseInt(split[i]);
        }
        arrayComposer(M, N);
    }

    /*
     *   这里通过示例可以知道,很显然 0 不被考虑在内。那么如果数组 N 中最小的数字是 1 ,那么就没有办法使用额外的元素来组装数组 R 了。
     *   那么 如果数组 N 中最小的元素都比 M 大呢?很显然,可以选择 数字 M ,这个时候仅有一种 组装方法了
     *
     *   --那么好,首先需要对数组 N 进行排序,然后记录一下 数组 N 中的最小元素 为 min
     *   --这个时候,需要考虑 什么样的组合可以添加一个 比 min 小的元素,来完成一种组装方法 (这里根据示例,需要注意的是,[2, 2, 1] 是一种组合方法 和 [1, 2, 2] 是相同的)
     *   --那么好,需要考虑如何去重
     *   --1. 记当前组合的和为 local 如果  M - local < min 的话,那么证明可以选择一个比 min 小的数字,视为一种组装方法。
     *   --2. 如何去重,那么就是每一个元素仅选取比自己大的元素
     *
     * 那么递归的签名函数就比较好想了
     * 1.当前路线所有数字的总和
     * 2.当前的数组索引下标,然后去选择大于等于当前索引下标的元素
     *
     */
    private static int[] N;
    private static int min;
    private static int M;

    private static int ans;

    private static void arrayComposer(int m, int[] n) {
        Arrays.sort(n);
        min = n[0];
        N = n;
        M = m;

        dfs(0, 0);

        System.out.println(ans);
    }

    private static void dfs(int idx, int local) {
        // 终止条件
        if(local == M) {
            ans += 1;
            return;
        }
        if(M > local && M - local < min) {
            ans += 1;
            return;
        }
        if(local > M) {
            return;
        }

        for(int i = 0;i < N.length;i++) {
            if(idx <= i) {
                dfs(i, local += N[i]);
            }
        }
    }

}

标签:min,int,组装,static,数组,local
From: https://blog.51cto.com/u_16079703/6601941

相关文章

  • 数组中查找单个不重复元素
    #include<stdio.h>intmain(){ intarr[]={1,2,3,4,5,1,2,3,4}; inti=0; intret=0; intsz=sizeof(arr)/sizeof(arr[0]); for(i=0;i<sz;i++) { ret=ret^arr[i]; } printf("%d",ret); return0;}......
  • 蓝图-数组
    蓝图-数组创建数组创建一个变量,在细节面板中选中ArrayGet(acopy)和Get(aref)都是通过索引返回数组值,不同的是ref实际上是获取数组本身,如果修改了ref将会反应回数组中,copy只是复制了一个相同的值,与数组元素无关,进行修改不会反应回数组中。如果只是读取数据建议使用copy,......
  • 350. 两个数组的交集 II
    难度简单980给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。 示例1:输入:nums1=[1,2,2,1],nums2=[2,2]......
  • 二维动态数组的例化理解(多维动态数组)
    例如:二维动态数组:cgs_addr_range_mapping[][]cgs_addr_range_mapping[cfg.mst_num][cfg.slv_num]如取cfg.mst_num=3cfg.slv_num=2例化第一层(第一维)cgs_addr_range_mapping=new[cfg.mst_num];//动态数组第一维赋值new第一层有的值cgs_addr_range_mapping[0][]......
  • 数组的隐式交集
    问题:在另一个表中引用“=轮休!$B$2:$G$5="休"”结果却不正确解决:公式本身没有问题,但是在输入的时候,组合键不应使用<Ctrl+Enter>,而是<Ctrl+Shift+Enter>,三键的结果才是数组。补充:<Ctrl+Enter>相当于复制,是在单元格中批量录入相同内容的组合键。此处使用了绝对引用,理论上......
  • JS中数组的22种常用API
    一、引言前端开发中,数组是一种常见且重要的数据结构。数组提供了许多便捷方便的方法来操作和处理其中的数据。本文将简单介绍前端开发中数组的常用API。二、22种常用方法2.1、push()和pop()push()方法用于向数组末尾增加一个元素,并返回数组最新的长度。constfruits=['......
  • 一维数组转为多维
    functionconvertToMultiDimensionalArray(arr){varmap={};varroots=[];//将数组元素以ID为键,构建一个映射表for(vari=0;i<arr.length;i++){varitem=arr[i];item.children=[];map[item.id]=item;varparentId=item......
  • js-遍历两个对象数组,属性值相等的一项合并属性并生成新数组
    operatData.value.seriesList=res.data.seriesList.reduce((accumulator,current)=>{constexisting=userOptionsColor.find(item=>item.name===current.name)if(existing){accumulator.push({...current,...existing})......
  • js 数组和链表分别实现队列
    链表实现/***1.单项链表实现队列,但要同时记录head和tail*2.要从tail入队,head出对,否则出队时,tail不好定位*2.单独记录length,不可遍历链表获取length*/classMyQueue{head=null;//头tail=null;//尾len=0;add(n){letnewNode={......
  • 【面试题】数组去重你想到几种办法呢?
    前言你是否在面试的过程中被考到过给你一个数组让你去掉重复项呢?当时你的脑海里除了用Set实现之外,你还与面试官讲了什么去重的方法呢?你能否封装来一个可复用的数组去重api呢?依稀记得当时我被问到这个问题的时候,我也没回答出很多种解决办法。那下面我来总结一下对于数组去重这道简单......