HDU 1258 Sum It Up (POJ 1564)

来源:互联网 发布:蒲公英软件 编辑:程序博客网 时间:2024/05/17 01:41

以前做过,碰巧看到了。我去复制了一下。很奇怪……交POJ的程序交HDU 就WA。

然后重写,交HDU的程序AC后再去交 POJ 居然TLE。简直……


简单DFS,判重就好了。


HDU :

#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<map>#include<stack>#include<iostream>#include<list>#include<set>#include<vector>#include<cmath>#define INF 0x7fffffff#define eps 1e-8#define LL long long#define PI 3.141592654#define CLR(a,b) memset(a,b,sizeof(a))#define FOR(i,a,b) for(int i=a;i<b;i++)#define FOR_(i,a,b) for(int i=a;i>=b;i--)#define rep(i,a,b) for(int i=a ; b>a?i<b:i>=b ; b>a? i++:i--)#define pb push_back#define mp make_pair#define ft first#define sd second#define sf scanf#define pf printf#define sz(v) ((int)(v).size())#define all(v) (v).begin(),(v).end()#define acfun std::ios::sync_with_stdio(false)#define SIZE 100000000 +1using namespace std;int n,m,a[12],b[12];bool vis[12];bool cmp(int a,int b){return a>b;}vector<string>ha;void dfs(int deep,int sum){    if(sum>m)return;    if(sum==m)    {        //pf("(%d==%d   %d)\n",sum,m,deep);        int out[12];        memcpy(out,b,sizeof(b));        sort(out,out+deep,cmp);        string ch;        ch.clear();        FOR(i,0,deep)        {            char tmp[11];            sprintf(tmp,"%d",out[i]);            ch.append(tmp);        }        FOR(i,0,sz(ha))            if(ha[i]==ch)return;        ha.pb(ch);        FOR(i,0,deep-1)        pf("%d+",out[i]);        pf("%d\n",out[deep-1]);    }    FOR(i,0,n)    {        if(vis[i])continue;        vis[i]=1;        b[deep]=a[i];        dfs(deep+1,sum+a[i]);        vis[i]=0;    }}int main(){    while(~sf("%d%d",&m,&n),n||m)    {        FOR(i,0,n)        sf("%d",&a[i]);        CLR(vis,0);        ha.clear();        pf("Sums of %d:\n",m);        dfs(0,0);        if(ha.empty())            puts("NONE");    }}

POJ 。以前撸的。


#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;}void 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 ;        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
原创粉丝点击