题目链接:https://codeforces.com/contest/1341/problem/D
题目大意:
一个数字我们可以用 7 个位置的LED管显示出来。 1 代表LED管亮, 0 代表LED管灭。
现在告诉你 n 个这样的东西并且给出它的每一个位置LED管的亮灭情况,允许你将 m 个灭的LED管点亮,问:你能组成的最大的数字是多少
想法:
直接 记忆话搜索 + 贪心就可以了
#include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define ll long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f3f3f3f3f #define max(a, b) (a>b?a:b) #define min(a, b) (a<b?a:b) const double eps = 1e-10; const int maxn = 2e3 + 10; const int MOD = 998244353; int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; } using namespace std; string str[] = {"1110111", "0010010", "1011101", "1011011", "0111010", "1101011", "1101111", "1010010", "1111111", "1111011"}; char s[maxn][10]; int vis[maxn][maxn]; int a[maxn]; int n,k; int change(int x,int y) { int cnt = 0; for (int i = 0;i < 7;i++) { if (s[x][i] == ‘0‘ && str[y][i] == ‘1‘) cnt++; if (s[x][i] == ‘1‘ && str[y][i] == ‘0‘) return -1; } return cnt; } void dfs(int cur,int res) { if (res < 0) return ; if (vis[cur][res]) return ; vis[cur][res] = 1; if (cur == n + 1) { if (res == 0) { for (int i = 1;i <= n;i++) { cout << a[i]; } cout << endl; exit(0); } return ; } for (int i = 9;i >= 0;i--) { int tmp = change(cur,i); if (tmp == -1) continue; a[cur] = i; dfs(cur+1,res-tmp); } } int main() { ios::sync_with_stdio(false); cin >> n >> k; for (int i = 1;i <= n;i++) { cin >> s[i]; } dfs(1,k); cout << -1 << endl; return 0; }
原文:https://www.cnblogs.com/-Ackerman/p/13177532.html