1 条题解

  • 2

    写代码不易,点个赞谢谢^^。

    高精度+简单dp/记忆化dfs。

    #include<bits/stdc++.h>
    using namespace std;
    int dig[11];
    int match[]={0,2,5,5,4,5,6,3,7,6};
    int n,m;
    vector<string> dp(10005,"-1");
    bool str_max(string a,string b){//比较
    	if(a.size()!=b.size())	return a.size()>b.size();
    	else 	return a>b;//位数相同,大的放前面
    }
    string dfs(int N){
    	if(dp[N]!="-1")	return dp[N];//搜过了
    	string ans="0";
    	for(int i=0;i<m;i++){
    		int cost=match[dig[i]];
    		if(N<cost)	continue;//如果不够摆
    		string nxt=dfs(N-cost);//接下来的
    		if(nxt!="0"){//如果有效
    			string tmp=to_string(dig[i])+nxt;
    			if(str_max(tmp,ans))//打擂台	ans=tmp;
    		}
    	}
    	return dp[N]=ans;//记忆化
    }
    int main(){
    	cin>>n>>m;
    	for(int i=0;i<m;i++)	cin>>dig[i];
    	dp[0]="";//初始化
    	cout<<dfs(n);
    }
    

    信息

    ID
    903
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者