密码是一个十进制的数(不超过20位,可用 long long表示),并且只能由给定的M个数字(可重复使用)中的某些构成,同时密码是一个给定十进制整数N的正整数倍, 输入: 输入N,M(N,M如上所述)( 3≤N≤5000, 1≤M≤10)。然后M个数(M个数输入是无序的,每个数范围在0~9),表示密码中含有哪些数字。(输入保证合法) 输出: 输出:密码如果存在,输出最小的那个密码,不存在”So Sorry.”(密码不含前导零) 使用c++语言实现
时间: 2024-02-01 17:14:30 浏览: 128
判断密码必须包括大小写字母,特殊字符,数字,长度8到16位
4星 · 用户满意度95%
```c++
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 20;
const int MAXM = 10;
int N, M;
int a[MAXM];//输入的M个数字
long long f[MAXN][MAXN];//f[i][j]表示使用i个数字组成j的最小数
int main() {
cin >> N >> M;
for (int i = 0; i < M; i++) {
cin >> a[i];
}
sort(a, a + M);//排序,方便后面去重
M = unique(a, a + M) - a;//去重
memset(f, -1, sizeof(f));
f[0][0] = 0;
for (int i = 1; i <= N; i++) {//枚举使用的数字个数
for (int j = 0; j < M; j++) {//枚举使用的数字
for (int k = 0; k <= i; k++) {//枚举组成的数的位数
if (f[i - k][0] != -1 && (k || j == 0)) {//前导0特判
long long t = f[i - k][0] * 10 + a[j];//计算组成的数
if (t % N == 0) {//是N的倍数
if (f[i][k] == -1 || t < f[i][k]) {
f[i][k] = t;
}
}
for (int l = 1; l <= k; l++) {//枚举前面已经用的数字的个数
if (f[i - k][l] != -1) {
t = f[i - k][l] * 10 + a[j];
if (t % N == 0) {//是N的倍数
if (f[i][k] == -1 || t < f[i][k]) {
f[i][k] = t;
}
}
}
}
}
}
}
}
if (f[N][0] == -1) {
cout << "So Sorry." << endl;
} else {
cout << f[N][0] << endl;
}
return 0;
}
```
阅读全文