POJ-3187 Backward Digit Sums

来源:互联网 发布:淘宝美工多少钱一个月 编辑:程序博客网 时间:2024/05/20 21:19

题目:http://poj.org/problem?id=3187

题意:求出 1~N 的数的组合 按照题目的规律得到最后的值等于题目的值的 组合

思路:使用 dfs 或者是 next_permutation

           记住两种排列的顺序都是从小到大的, 所以一旦找到答案便是最小的排列,便可以直接输出。

CODE:

#include <iostream>#include<stdio.h>#include<algorithm>const int inf=0xffffff;using namespace std;int num[20],vis[20],n[20];int N,S;int ok;void work(){    int nn[20];    for(int i=0;i<N;i++)    {        nn[i]=n[i];    }    for(int i=N;i>=0;i--)    {        for(int j=0;j<i-1;j++)            nn[j]=nn[j]+nn[j+1];    }    if(nn[0]==S)    {        ok=1;        printf("%d",n[0]);        for(int i=1;i<N;i++)            printf(" %d",n[i]);        printf("\n");    }}void dfs(int i){    if(ok==1) return ;    if(i==N)    {        work();        return ;    }    for(int ii=0;ii<N;ii++)    {        if(vis[ii]) continue;        vis[ii]=1;        n[i]=num[ii];        dfs(i+1);        vis[ii]=0;    }    return ;}int main(){    while(~scanf("%d %d",&N,&S))    {        ok=0;        for(int i=0;i<N;i++)            num[i]=i+1;        dfs(0);    }    return 0;}

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>const int inf=0xffffff;using namespace std;int num[20],ans[20],n[20];int N,S;int work(){    for(int j=N;j>=0;j--)    {        for(int i=0;i<j-1;i++)        {            n[i]=n[i]+n[i+1];            //printf("%d\n",n[i]);        }    }    return n[0];}int main(){    while(~scanf("%d%d",&N,&S))    {        for(int i=0;i<N;i++)            num[i]=i+1;        fill(ans,ans+N,inf);        do        {            for(int i=0;i<N;i++)                n[i]=num[i];            if(work()==S)            {                for(int i=0;i<N;i++)                {                    if(num[i]>ans[i]) break;                    if(num[i]<ans[i])                    {                        for(int i=0;i<N;i++)                            ans[i]=num[i];                        break;                    }                }            }        }while(next_permutation(num,num+N));        printf("%d",ans[0]);        for(int i=1;i<N;i++)        {            printf(" %d",ans[i]);        }        printf("\n");    }    return 0;}



0 0
原创粉丝点击