POJ 3187 Backward Digit Sums
暴力DFS+验证。
验证如果是暴力检验可能复杂度会太高,事实上可以o(1)进行,这个可以o(n*n)dp预处理。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=20; bool flag[maxn]; bool r; int a[maxn]; int n,sum; int mul[15][15]; bool check(int s) { if(s==sum) return 1; return 0; } void dfs(int deep,int tot) { if(deep==n-1) { if(check(tot)) { r=1; for(int i=0;i<=deep;i++) { printf("%d",a[i]); if(i<deep) printf(" "); else printf("\n"); } } return ; } for(int i=1;i<=n;i++) { if(flag[i]==0) { flag[i]=1; a[deep+1]=i; dfs(deep+1,tot+a[deep+1]*mul[n][deep+1+1]); if(r==1) return; flag[i]=0; } } } void init() { memset(mul,0,sizeof mul); mul[1][1]=1; for(int i=2;i<=10;i++) { for(int j=1;j<=10;j++) mul[i][j]=mul[i-1][j]; for(int j=2;j<=10+1;j++) mul[i][j]=mul[i][j]+mul[i-1][j-1]; } } int main() { init(); while(~scanf("%d%d",&n,&sum)) { r=0; memset(flag,0,sizeof flag); for(int i=1;i<=n;i++) { flag[i]=1; a[0]=i; dfs(0,a[0]*mul[n][0+1]); flag[i]=0; } } return 0; }