#include using namespace std; #define ALL(x) x.begin(),x.end() #define rep(i,n) for(int i=0;i<(n);i++) #define debug(v) cout<<#v<<":";for(auto x:v){cout<bool chmax(T &a,const T &b){if(abool chmin(T &a,const T &b){if(b ostream &operator<<(ostream &os,const pair&p){ os< ostream &operator<<(ostream &os,const vector&v){ for(int i=0;i<(int)v.size();i++) os< knapsack(char target){ int cnt[n]={}; rep(i,n)rep(j,s[i].size())cnt[i]+=(int)(s[i][j]==target); vector dp(k+1,LINF); dp[0]=0; rep(i,n){ for(int j=0;j<=k;j++){ if(j-cnt[i]>=0){ chmin(dp[j],dp[j-cnt[i]]+cost[i]); } } } ll m=LINF; for(int i=k;i>=0;i--){ chmin(m,dp[i]); dp[i]=m; } return dp; } signed main(){ cin>>n>>k; rep(i,n) cin>>s[i]>>cost[i]; auto dpj=knapsack('J'); auto dpo=knapsack('O'); auto dpi=knapsack('I'); if(dpj[k]==LINF or dpo[k]==LINF or dpi[k]==LINF){ cout<<-1<=k){ int jaru=cj[i][l],iaru=ci[i][s[i].size()]-ci[i][r]; int needj=max(0,k-jaru),needi=max(0,k-iaru); chmin(ans,cost[i]+dpj[needj]+dpi[needi]); } } } } } cout<