分支限界法:求最小倍数

通过分支限界法解决寻找给定自然数N(0≤N≤4999)的最小倍数问题,给定M个不同的十进制数字,目标是在不超过2^32-1的范围内找出最小的N的倍数。输入包含N和M以及M个数字,输出符合条件的最小倍数。算法中,从数字队列中取出节点并扩展,生成儿子节点,按升序排序数字以确保找到最小倍数。当找到n的倍数时输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定一个自然数N,0≤N≤4999和M各不同的十进制数字X1,X2,……,XM, 找出由这些数字所构成的正整数中N的倍数最小的正整数,设该正整数不超过232-1。

输入要求:
输入的第一行有两个整数,分别为该自然数N和数字的个数M,第2行有M个数字( 0≤M≤9),数字之间用空格隔开。
输出要求:
输出一行为由这些数字所组成的该自然数的最小倍数,数字可重复使用。如果不存在这样的数,则输出0.
样例输入:
22 3
7 0 1
样例输出:
110

样例输入:
22 3
7 0 1
样例输出:
110
自然数为22,十进制数共有3个,分别是7 0 1,根据排列组合,寻找其能组成的22的最小倍数

使用队列分支限界算法,不断从活结点队列中取出当前扩展结点head,并产生当前结点head的所有儿子结点。在扩展结点时,先将数字a[i](即Xi)扩展到当前结点余数的尾部:
如果x=0,0%n是无效的,该子结点不放进队列。如果x%n还没有计算过,将该子结点放入队列中,否则其计算结果保存在r[x%n]中。对当前结点E,如果symbol[0]=true,表示找到了n的倍数,直接输出E.digit。
实现N的最小倍数:为了确保找到的就是N的最小倍数,我们每次从数字X1,X2,…,XM中,首先取出最小的数字构造,然后是次小的等等,这样第一个满足条件的数字就是最小的倍数。通过对这些数字按升序排序,就可以实现。

从根节点0开始组成一个一元堆
根元素显然不是目标节点,因此删除根元素,并把根元素的后代节点添加到堆中
同理,对于不是目标节点的元素进行删除,添加其后代节点到堆中,直到出现目标节点110,算法结束
运行截图如下:
在这里插入图片描述

#include <iostream>
#include <string>
#include <queue>
using namespace std;

typedef struct {
   
    int num;
    string digit;
}node;

queue<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值