- 首先需要字典映射。
- 当遇到选择列表的时候,可以考虑回溯。
- 注意先要按照题意排序,按照排序(偏贪心)的基础上,在进行回溯。
- 最后的结果记得在字母排序
#include<bits/stdc++.h>
using namespace std;
bool backtrack(map<int,int>& mt, vector<pair<int,int>> v, string& ret, int n ){
//base case
if(n==0){
return true;
}
for(int i =0; i< v.size();i++){
if(v[i].second<=n){//当前得满足剩余的火柴棍得数目
ret.push_back(v[i].first+'0');
bool res = backtrack(mt,v,ret,n-v[i].second);//当前字符以及对应得剩余火柴棍数
if(res) return true;
ret.pop_back();//回溯
}
}
return false;
}
int main(){
map<int,int> nums;
nums[1]=2;
nums[2]=5;
nums[3]=5;
nums[4]=4;
nums[5]=5;
nums[6]=6;
nums[7]=3;
nums[8]=7;
nums[9]=6;
int n,m,x;
while(cin>>n>>m){
vector<pair<int,int>> v;
for(int i =0; i< m;i++){
cin>>x;
v.push_back({x,nums[x]});//数字以及对应的火柴棍的数量
}
sort(v.begin(),v.end(),[](pair<int,int> a, pair<int,int> b){
if(a.second!=b.second){
return a.second< b.second;//火柴棍少的放在前面
}else{
return a.first>b.first; //数字大的放前面
}
});
string res="";
//回溯,来找在满足排序条件下最终能组成得字符串
backtrack(nums,v,res,n);//当前字符以及对应得剩余火柴棍数
sort(res.begin(),res.end(),[](char a, char b){
return a>b;//确保数字从大到小排序,这样得到的就是最大得数字
});
cout<<res<<endl;
}
return 0;
}