题意:
题意是可放回的选择k次,要求每次选出的子序列本质不同,总花费是每次花费的和。
数据范围:n,k<=100
解法:
显然先选择长的,然后选择短的,考虑到数据范围非常小(<=100),
可以用bfs做,bfs的好处是队列前面的都是长度大的.
code:
#include <bits/stdc++.h>
using namespace std;
signed main(){
int n,k;cin>>n>>k;
string s;cin>>s;
queue<string>q;
q.push(s);
map<string,int>mark;
mark[s]=1;
int ans=0;
while(!q.empty()&&k){
string x=q.front();q.pop();
ans+=n-x.size();
k--;
int len=x.size();
for(int i=0;i<len;i++){//枚举删掉的位置
string temp=x.substr(0,i)+x.substr(i+1,len-i-1);
if(!mark[temp]){
mark[temp]=1;
q.push(temp);
}
}
}
if(k)ans=-1;
cout<<ans<<endl;
return 0;
}