裸的数位dp,是我写的第二道数位dp。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define INF 200000000
int dp[11][5050],a,b[12],p[11];
int dfs(int pos,int sta,int flag)
{
int ans,i,j,k,l,t;
if(sta<0)
return 0;
if(pos==0)
return 1;
ans=0;
if(!flag&&dp[pos][sta]!=-1) return dp[pos][sta];
t=flag?b[pos]:9;
for(i=0;i<=t;i++)
{
ans+=dfs(pos-1,sta-i*p[pos],flag&&i==t);
}
if(!flag)
{
dp[pos][sta]=ans;
//printf("%d %d %d\n",pos,sta,dp[pos][sta]);
}
return ans;
}
int solve(int x)
{
int i,j,k,l,idx;
idx=0;
if(x==0)
return 1;
while(x>0)
{
b[++idx]=x%10;
x=x/10;
}
return dfs(idx,a,1);
}
int main()
{
int t,A,B,i,j,k,l,temp;
for(i=2,p[1]=1;i<=9;i++)
p[i]=p[i-1]*2;
memset(dp,-1,sizeof(dp));
while(scanf("%d",&t)!=EOF)
{
for(l=1;l<=t;l++)
{
scanf("%d%d",&A,&B);
printf("Case #%d: ",l);
a=0;temp=1;
while(A>0)
{
a+=(A%10)*temp;
temp*=2;
A=A/10;
}
printf("%d\n",solve(B));
}
}
return 0;
}