算法题解之 Item4box

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

将m个item分配到n个box中,每个box中可存多个item,每个item只能放到一个box中。试求所有可能的解。每个Box都是一样的,所以解没有顺序之分。也就是说2,3,5 和 2 ,5,3被认为是同样的解。

给出指定的m(m>=0)和n(n >0),请给出所有的解。

 

这个题可以按照分治递归的思路求解。当box 数量是1或者2时很容易求解。 当 box =1 时直接返回m就是所求解;当 box=2时,可以把m(例如m=5)分成两步进行求解,那么可能的组合为 (0<=i<=m/2, m-i)

(0 5)

(1 4)

(2 3)

当box >2时,可以把box按照box/2取中分解成两部分,同时按照上述分解m(Item数量)的方式将m进行分解。如此递归。

 

package com.tr.algorithm.example.item4box;

public class IntelliItemDist {
 
 public IntelliItemDist(){
  super();
 }
    /**
     * 递归分配item 到 box 中。
     * @param 待分发的item数量
     * @param 可用的box数量
     * @return 返回可用方案。
     */
   
 private int[][] dispatch(int item,int box){
  
  int[][] m = new int[0][0];
  if (box == 1){
   m = new int[1][1];
   m[0] = new int[]{item};
  }else if (box ==2){
   int middleItem = item/2;
   m = new int[middleItem+1][2];
   
   for (int i=0;i< m.length;i++){
    m[i] = new int[]{i,item-i};
   }
  }else if (box > 2){
   int middleBox = box/2; //取box中数,
   int middleItem = item/2;//取item中数
   for (int i =0 ; i <= middleItem;i++){
    int[][] left = dispatch(i,middleBox);
    int[][] right= dispatch(item-i,box-middleBox);
    int[][] lr = crossMerge(left,right);
    m = appendMerge(m,lr);

   }
  }
  
  return m;
 }
 /**
  * 将两个二维数组left[m][n],right[j][k]合并成m[m*j][]数组。
  */
 private int[][] crossMerge(int[][] left,int[][] right){
  int[][] m = new int[left.length * right.length][];
  int row = 0;
  for (int i=0;i< left.length;i++){
   for (int j=0;j< right.length;j++){
    int[] l = left[i];
    int[] r = right[j];
    m[row] = merge(l,r);
    row++;
   }
  }
  
  return m;
  
  
 }
 /**
  * 将两个二维数组left[m][n],right[j][k]合并成m[m+j][]数组。
  */
 private int[][] appendMerge(int[][] left,int[][] right){
  int[][] m = new int[left.length + right.length][];
  for (int i=0;i< left.length;i++){
        m[i] = left[i];
  }
  for (int i=left.length;i< m.length;i++){
       m[i] = right[i - left.length];
  }
  
  return m;
  
  
 }
 /**
  * 将两个一维数组left[m],right[j]合并成m[m+j]数组。
  */
 private int[] merge(int[] left,int[] right){
  int[] m = new int[left.length + right.length];
  System.arraycopy(left,0,m,0,left.length);
  System.arraycopy(right, 0, m, left.length, right.length);
  return m;
 }
 
 public static void main (String[] args){
  
            int item = 5,box=4;
      IntelliItemDist bpu = new IntelliItemDist();
      int[][] solution = bpu.dispatch(item,box);
     
      for (int i = 0;i<solution.length;i++){
       for (int j = 0;j<solution[i].length;j++){
        System.out.print(solution[i][j] + " ");
       }
       System.out.println();
      }
     
 }

}

方案输出如下:

0 0 0 5
0 0 1 4
0 0 2 3
0 1 0 4
0 1 1 3
0 1 2 2
0 2 0 3
0 2 1 2
1 1 0 3
1 1 1 2

 

目前改方法存在重复解决方案,原因是子问题不能互相独立。有时间再解。也请高手不吝赐教。

手把手教你用运放和基准源,把±10V信号变成ADC能吃的0-4V(附完整计算过程) 本文详细介绍了如何利用OP07运放和REF5040基准源设计工业级信号调理电路,将±10V传感器信号转换为0-4V ADC可接受范围。通过七步流程,包括需求分析、元器件选型、电路设计、理论计算、PCB布局、实测验证与性能优化,帮助工程师解决信号不匹配问题,提升系统精度与稳定性。 阅读详情

相关推荐

【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)

一颗芯片的诞生经历了设计、制造和测试(分别对应集成电路产业链的设计业、制造业和封测业),而每一步都包含了复杂的步骤和流程。 图0-1 集成电路产业链 现在,我们重点介绍芯片设计的全流程以及每个流程需要用到的设计工具和需要参与的工作人员。 一、IC设计分类 首先对IC设计的分类做个介绍,如图1-1所示。 图1-1 IC设计分类 如图1-1所示,IC设计可以粗分为数字IC设计和射频/模拟IC设计,数字IC设计又可分为ASIC设计和FPGA/CPLD设计,此外还有一部分IC设计.

qq_36045093的博客 8万+

UVA1587 盒子 Box 题解

题意翻译 给定6个矩形的长和宽wi和hi(1<=wi,hi<=10000),判断它们能否构成长方体的六个面。 输入输出样例 Sample Input 1345 2584 2584 683 2584 1345 683 1345 683 1345 2584 683 1234 4567 1234 4567 4567 4321 4322 4567 4321 1234 4321 1234 Sample Output POSSIBLE IMPOSSIBLE 思路 判断是否可以组成长

m0_63486615的博客 280

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统

本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。

weixin_29161785的博客 301

BZOJ5138 Push a Box题解(bfs+圆方树)

题目:BZOJ5138. 题目大意:给定一张n∗mn*mn∗m的有障碍点的网格,分别有两个位置有人和箱子.现在给出qqq个询问,每次询问从初始状态是否让人把箱子推到某个位置. 1≤n,m≤1.5∗103,1≤q≤5∗1041\leq n,m\leq 1.5*10^3,1\leq q\leq 5*10^41≤n,m≤1.5∗103,1≤q≤5∗104. 看到这道题我们可以想到用bfs来求出一个数组v...

hzk_cpp的博客 323

基于FPGA的工业相机项目大赏1——cmos线阵相机

●CMOS CL0402 作为图像传感芯片,曝光后产生一定格式的图像数据;●FPGA ZYNQ7020 作为主控芯片负责cmos驱动控制、图像像素的采集、cmos寄存器的配置、cameralink协议的实现、上位机串口通信的实现;●Cameralink端子实现图像数据的高速串行发送,将数据传送至采集卡PC端。系统工作流程如下: FPGA 上电加载配置程序,计算机通过异步串口向 FPGA 发送控制信息,FPGA对接收的控制信息进行分析判断。

weixin_41895751的博客 6400

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6503

*ctf box题解

题目给了源码 /* * main.c * Copyright (C) 2019 hzshang <hzshang15@gmail.com> * * Distributed under terms of the MIT license. */ #include <stdio.h> #include <stdlib.h> #include <str...

Cosmopolitan的博客 1347

【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤

Windows 11 安装 WSL2 和 Ubuntu 22.04 指南 本文详细介绍在 Windows 11 上安装 WSL2 和 Ubuntu 22.04 的完整步骤,包括: WSL2 与 VirtualBox 的性能对比优势 系统版本检查与升级方法 两种安装方式(一键安装和手动安装) Ubuntu 22.04 的安装与配置 存储位置管理及迁移技巧 常用 WSL2 命令速查表 文章还提供了性能优化建议和常见问题解决方案,适合开发者和 Linux 爱好者快速搭建高效的开发环境。

No8g攻城狮的博客 2万+

题解 poj1845 Sumdiv (数论) (分治)

传送门 大意:求A^B的所有因子之和,并对其取模 9901再输出 (这题又调了半天,把n和项数弄混了QAQ) 根据算数基本定理:A=(p1^k1)*(p2^k2)*(p3^k3)*...*(pn^kn) (pi为素数) 则A的所有因子之和Sum=(1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p...

133

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5816

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

n个球找一个次品(分治,递归)

ch3 Table of Contents 1 n个球找一个次品 1 n个球找一个次品 问题描述:给定n个球,其中1个球为次品。次品从外表上看与正常球一样,但重量有区别。它可能比正常球重,也可能比正常球轻。现在给你一个天平,我们的问题是,需要称几次才能将次品甄别出来? 这个问题的解答思路十分简单:就是将次品所在的范围不断地缩小,直到只有一个球为止。例如,先将所

芝兰生于深谷,不以无人而不芳 4197

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法阅读学习

算法

m0_72572822的博客 385

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2020/7/28前端学习日记

CSS3 Flex -flex布局是什么 Flex 是 Flexible Box 的缩写,意味“弹性布局”,用来为盒状模型提供最大的灵活性。 任何一个容器都能指定为flex布局。 使用方法:display:flex webkit内核浏览器需要加上-webkit-前缀 display:-webkit-flex 注意,设为flex布局后,子元素的float,clear,vertical-align属性将失效。 -基本概念 水平轴为主轴,主轴开始位置(与边框的交叉点)叫做main start,结束位置叫做mai

weixin_42400773的博客 142

商汤校招前端笔试全解析:题型、考点与备考策略

在AI公司前端岗位的校招中,笔试往往不局限于页面布局与框架API,而是更看重算法逻辑与计算机基础的扎实程度。理解数据结构如数组、链表、哈希表,掌握动态规划、滑动窗口等经典算法,是应对高难度编程题的核心;同时,浏览器渲染机制、重排重绘、事件循环、HTTP缓存等前端底层知识,也决定了候选人能否胜任数据密集型可视化产品的开发。这类笔试通过高频算法题和工程化设计题,筛选出具备计算思维与工程素养的开发者。备考时需兼顾刷题与前端基础的系统梳理,并熟悉在线笔试的输入输出处理。本文以商汤科技前端笔试为例,拆解题型分布、高频

weixin_34026276的博客 429

SumatraPDF 中的 msdes 库:D3DES 公共领域实现与 .lit DRM1 解密实战

本指南深入解析 SumatraPDF 仓库中 [ext/msdes](https://link.gitcode.com/i/4e6516155f03c47495414465a7ecbf18) 子模块:一个从 calibre 引入的 D3DES(V5.09)公共领域 DES 实现。文章将说明该库的源码组成、API 契约、在 [src/LitDoc.cpp](https://link.gitcode.

gitblog_00608的博客 405

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 199

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 308

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 569

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 748

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 82

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 207

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178
上一篇: 递归与分治策略之二分搜索(Java版本)
下一篇: 生产者-消费者模式 系列 之一 Sychronized,Notify,Wait 篇
TechNerd
博客等级 码龄14年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值