题目:
给定一个自然数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<