参考:http://www.cnblogs.com/kuangbin/p/3321997.html
题:http://acm.hdu.edu.cn/showproblem.php?pid=4734
#include<stdio.h>
#include<string.h>
int p[20][10000];
int bit[20];
int dfs(int pos,int num,int flag)
{
if(pos==-1) return num>=0;
if(num<0) return 0;
if(flag==0&&p[pos][num]!=-1) return p[pos][num];
int end=flag?bit[pos]:9;
int i,j,k,ans=0;
for(i=0;i<=end;i++)
ans+=dfs(pos-1,num-i*(1<<pos),flag&&i==end);
if(flag==0) p[pos][num]=ans;
return ans;
}
int main()
{
int i,j,k;
int t,n;
scanf("%d",&t);
char ch[11];
memset(p,-1,sizeof(p));
for(k=1;k<=t;k++)
{
scanf("%s %d",ch,&n);
int len=strlen(ch);
int ans=0;
for(i=0;i<len;i++)
ans+=(ch[i]-'0')*(1<<(len-i-1));
j=0;
while(n){
bit[j++]=n%10;
n/=10;
}
printf("Case #%d: %d\n",k,dfs(j-1,ans,1));
}
}