POJ 3187 Backward Digit Sums

来源:互联网 发布:网络祭奠亲人 编辑:程序博客网 时间:2024/05/10 11:26

简单搜索~~~


#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 20;int C[MAXN][MAXN];int path[MAXN], ans[MAXN];bool visit[MAXN];int N, M;bool flag;void Init(){    memset(C, 0, sizeof(C));    C[0][0] = 1;    for(int i = 1; i <= 10; ++i)    {        C[i][0] = C[i][i] = 1;        for(int j = 1; j < i; ++j)        {            C[i][j] = C[i-1][j-1] + C[i-1][j];        }    }}void dfs(int cnt){    if(flag) return;    if(cnt == N)    {        int temp = 0;        for(int i = 0; i < N; ++i)        {            //cout << path[i] << " ";            temp += C[N-1][i] * path[i];        }        //cout << "       " << temp << endl;        if(temp == M)        {            flag = true;            for(int i = 0; i < N; ++i)            {                ans[i] = path[i];            }        }        return ;    }    for(int i = 1; i <= N; ++i)    {        if(!visit[i])        {            path[cnt++] = i;            visit[i] = true;            dfs(cnt);            cnt--;            visit[i] = false;        }    }    return ;}int main(){    //freopen("aa.in", "r", stdin);    //freopen("bb.out", "w", stdout);    Init();    while(cin >> N >> M)    {        memset(visit, false, sizeof(visit));        flag = false; dfs(0);        cout << ans[0];        for(int i = 1; i < N; ++i)        {            cout << " " << ans[i];        }        cout << endl;    }    return 0;}


原创粉丝点击