luogu p2549
字符串01背包
#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int> m = {{'D',0},{'O',0},{'G',9},{'B',8},{'L',7},{'q',6},{'S',5},{'h',4},{'E',3},{'Z',2},{'I',1}};
int D;
int n;
char ch[35];
const int MAXD = 210;
vector<string> v;
string dp[MAXD];
string maxs(string a,string b)
{
int na=a.size(),nb=b.size();
if (na==0)//特殊情况
return b;
if (nb==0)
return a;
if (a[0]!='0'&&b[0]!='0')
{
if (na!=nb)//先判位数
return na>nb?a:b;
return a>b?a:b;
}
return a>b?a:b;
}
int main(){
cin>>D;
cin>>n;
for(int i =1;i<=n;i++){
scanf("%s",ch);
string s = "";
for(int i =strlen(ch)-1;i>=0;i--){
s += to_string(m[ch[i]]);
}
v.push_back(s);
}
sort(v.begin(),v.end(),[](string a,string b){
return a+b>b+a;
} );
dp[0] = "";
for(int i =0;i<v.size();i++){
int sz = v[i].size();
for(int j = D;j>=sz;j--){
dp[j] = maxs(dp[j],dp[j-sz] + v[i]);
}
}
if(dp[D][0]!='0')
cout<<dp[D]<<endl;
else{
cout<<"0.";
for (int i=1;i<dp[D].size();i++)
cout<<dp[D][i];
}
return 0;
}
京公网安备 11010502036488号