链接:https://codeforces.com/contest/1560/problem/F1
题意:
要求用0-9中选k个数作为目标数的某一位(可以重复用)
输出大于等于给出数的最小值
题解:
不是数位DP,但是很像
从前往后查找,对于某位置升序查找
判断一下取的数是否满足条件(状压DP思想)
这样确保找到的数一定是最小的
#include<bits/stdc++.h>
using namespace std;
string s;
int ans;
int k;
int check(int num){
return __builtin_popcount(num);
}
void dfs(int pos,int lim,int sta,int sum){
if(pos==s.size()){
ans=sum;
return;
}
int start=0;
if(lim) start=s[pos];
for(int i=start;i<=9;i++){
if(ans==0&&check(sta|(1<<i))<=k){
dfs(pos+1,lim&&(i==s[pos]),sta|(1<<i),sum*10+i);
}
}
}
void solve(){
ans=0;
cin>>s>>k;
for(int i=0;i<s.length();i++){
s[i]-='0';
}
dfs(0,1,0,0);
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
//system("pause");
return 0;
}