zoukankan      html  css  js  c++  java
  • HDU 1258 Sum It Up (dfs)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[20];
    int ans[20];
    int num[200];
    struct Mark
    {
        int shu,rt;
    };
    Mark mark[20];
    int ok;
    int n,t;
    int cnt;
    int cmp(int x,int y)
    {
        return x>y;
    }
    void dfs(int rt,int i,int j,int sum)
    {
           if(sum>t) return ;
           int k,l;
           mark[rt].shu=a[i];
           mark[rt].rt=j;
           //printf("%d...
    ",sum);
           if(sum==t)
           {
               ok=1; //printf("%d
    ",rt);
    
               int coun=0;
               /*if(t==5&&rt==3)
               {
                   printf("%d %d %d %d
    ",rt,i,j,sum);
               }*/
               for(k=1;k<=rt;k++)
               {
                  for(l=1;l<=mark[k].rt;l++)
                  {
                      ans[coun++]=mark[k].shu;
                  }
               }
               for(k=0;k<coun;k++)
               {
                   if(k!=0) printf("+");
                   printf("%d",ans[k]);
               }
               printf("
    ");
               return ;
           }
           if(i<cnt-1)
           {
               for(k=num[a[i+1]];k>=0;k--)
               {
                   dfs(rt+1,i+1,k,sum+a[i+1]*k);
               }
           }
    }
    int main()
    {
        int i,j,k;
        int temp;
        //int cnt;
        while(scanf("%d%d",&t,&n)!=EOF)
        {
            if(t==0&&n==0) break;
            ok=0; cnt=0;
            memset(ans,0,sizeof(ans));
            memset(num,0,sizeof(num));
            memset(mark,0,sizeof(mark));
    
            for(i=0;i<n;i++)
            {
                scanf("%d",&temp);
                if(num[temp]==0)
                {
                    a[cnt++]=temp;
                }
                num[temp]++;
            }
            //printf("%d..
    ",cnt);
            sort(a,a+cnt,cmp);
            /*for(i=0;i<cnt;i++)
            {
                printf("%d %d..
    ",a[i],num[a[i]]);
            }*/
            printf("Sums of %d:
    ",t);
    
                for(i=num[a[0]];i>=0;i--)
                {
                    dfs(1,0,i,a[0]*i);
                }
    
            if(ok==0)
                printf("NONE
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    第二周作业
    求最大值及下标编程总结
    查找整数编程总结
    课程设计第一次实验总结
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
  • 原文地址:https://www.cnblogs.com/sola1994/p/4678956.html
Copyright © 2011-2022 走看看