POJ 1564 Sum It Up

来源:互联网 发布:linux shell rm rf 编辑:程序博客网 时间:2024/05/21 08:46

简单DFS。搜一下某个数由那些加起来的。注意判重。

#include<cstdio>#include<cstring>int sum,n,a[10001];int vis[10001],ok;int ck[10001],top=0;int check(int ans){    int i;    for(i=0;i<top;i++)    if(ck[i]==ans)return 0;    ck[top++]=ans;return 1;}int dfs(int s,int j){    int i;    if(s==sum)    {        int o=0;ok=1;        int num=0,j=1;        for(i=0;i<n;i++)        {            if(vis[i])            num=num+a[i]*j,j++;        }        if(!check(num))return 0;        for(i=0;i<n;i++)        {            if(vis[i]&&!o)printf("%d",a[i]),o=1;            else if(vis[i])printf("+%d",a[i]);        }        printf("\n");    }    else    {        for(i=j;i<n;i++)        if(s+a[i]<=sum&&!vis[i])        vis[i]=1,dfs(s+a[i],i+1),vis[i]=0;    }}int main(){    int i;    while(scanf("%d%d",&sum,&n),sum!=0,n!=0)    {        memset(vis,0,sizeof(vis));        for(i=0;i<n;i++)        scanf("%d",&a[i]);        printf("Sums of %d:\n",sum);        ok=0;top=0;dfs(0,0);        if(!ok)printf("NONE\n");    }}


0 0
原创粉丝点击