#include<bits/stdc++.h>
using namespace std;
int cnt[10]={0,2,5,5,4,5,6,3,7,6};
int dp[10007];
int vis[17];
int main(){
int n,m;
scanf("%d%d",&n,&m);
memset(dp,-1,sizeof(dp));
dp[0]=0;
while(m--){
int x;
scanf("%d",&x);
vis[x]=1;
for(int i=cnt[x];i<=n;i++)
dp[i]=max(dp[i],dp[i-cnt[x]]+1);//位数越大越好
}
int tmp=n;
while(tmp){
for(int i=9;i;i--){//从后向前枚举使得尽可能大
if(vis[i]&&tmp>=cnt[i]&&dp[tmp-cnt[i]]==dp[tmp]-1){//动态规划转化而来
printf("%d",i);
tmp-=cnt[i];
break;
}
}
}
return 0;
}
Atcoder Beginner Contest 118D(DP,完全背包,贪心)
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)