hdu 1258 Sum It Up(pku1564 Sum It Up )

#include <stdio.h>
#include <string.h>

 

#define N 15

 

int t,n,a[N],out[N],o;

bool flag,used[N];

 

void dfs(int cur,int sum)
{
    if(sum==t)
    {
        flag=false;
        bool first=true;
        for(int i=0; i<o; i++)
        {
            if(first)
            {
                printf("%d",out[i]);
                first=false;
            }
            else
            {
                printf("+%d",out[i]);
            }
        }
        printf("\n");
    }
    else
        for(int i=cur; i<n; i++)
        {
            if(sum+a[i]>t) continue;
            //        if(i!=0 && a[i]==a[i-1] && !used[i-1]) continue;
            if(!used[i])
            {
                out[o++]=a[i];
                used[i]=true;
                dfs(i+1,sum+a[i]);
                used[i]=false;
                o--;
                ////////////////////////////////////////////////
                i++;
                while(i<n && a[i]==a[i-1]) i++;
                i--;
            }
        }
}

int main()
{
    while(scanf("%d %d",&t,&n) && (t||n) )
    {
        int i;
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<n; i++)
            if(a[i]<=t) break;
        memset(used,false,sizeof(used));
        flag=true;
        o=0;
        printf("Sums of %d:\n",t);
        dfs(i,0);
        if(flag) printf("NONE\n");
    }
    return 0;
}


//************************************************************************************************

 

//一样的题pku1564 Sum It Up ,法2:
#include <iostream>
using namespace std;

#define N 15

int t,n,a[N];
bool flag,used[N]= {0};

void dfs(int cur,int sum)
{
    if(sum==t)
    {
        flag=false;
        bool first=true;
        for(int i=0; i<n; i++)
            if(used[i])
            {
                if(first)
                {
                    printf("%d",a[i]);
                    first=false;
                }
                else printf("+%d",a[i]);
            }
        printf("\n");
    }
    else
        for(int i=cur; i<n; i++)
        {
            if(sum+a[i]>t) continue;
            //  if( i && a[i]==a[i-1] && !used[i-1]) continue; //师兄的mark模板
            if(!used[i])
            {
                used[i]=true;
                dfs(i+1,sum+a[i]);
                used[i]=false;

                int k=i+1;
                while(k<n && a[k]==a[i]) k++;
                i=k-1;
            }
        }
}

int main()
{
    while(scanf("%d %d",&t,&n),n)
    {
        int i;
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<n; i++)
            if(a[i]<=t) break;
//  memset(used,false,sizeof(used));
        flag=true;
        printf("Sums of %d:\n",t);
        dfs(i,0);
        if(flag) printf("NONE\n");
    }
    return 0;
}

 

posted @ 2010-08-18 13:45  菜到不得鸟  阅读(645)  评论(0)    收藏  举报