裸的数位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; }