题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734
思路:记忆化搜索。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int Pow[11]; 7 int dp[11][5050]; 8 int digit[11]; 9 int a,b; 10 11 int Get_f(int n) 12 { 13 int pos=0,res=0; 14 while(n){ 15 digit[pos++]=n%10; 16 n/=10; 17 } 18 for(int i=0;i<pos;i++)res+=digit[i]*Pow[i]; 19 // cout<<res<<"**"<<endl; 20 return res; 21 } 22 23 int dfs(int pos,int res,int doing) 24 { 25 if(res<0)return 0; 26 if(pos==-1)return 1; 27 if(!doing&&dp[pos][res]!=-1)return dp[pos][res]; 28 int End=doing?digit[pos]:9; 29 int ans=0; 30 for(int i=0;i<=End;i++){ 31 ans+=dfs(pos-1,res-i*Pow[pos],doing&&i==End); 32 } 33 if(!doing){ 34 dp[pos][res]=ans; 35 } 36 return ans; 37 } 38 39 int Solve(int res,int n) 40 { 41 int pos=0; 42 while(n){ 43 digit[pos++]=n%10; 44 n/=10; 45 } 46 return dfs(pos-1,res,1); 47 } 48 49 int main() 50 { 51 memset(dp,-1,sizeof(dp)); 52 Pow[0]=1; 53 for(int i=1;i<=10;i++)Pow[i]=Pow[i-1]<<1; 54 int _case,t=1; 55 scanf("%d",&_case); 56 while(_case--){ 57 scanf("%d%d",&a,&b); 58 printf("Case #%d: ",t++); 59 printf("%d\n",Solve(Get_f(a),b)); 60 } 61 return 0; 62 }